[英]Is there a way to change the prototype from within a function in Javascript?
[英]How to have an instance delete itself from within a prototype function is JavaScript
如果我具有JavaScript构造函数,并且在其原型上设置了destroy方法。 是否可以从destroy方法中删除(或至少取消设置)实例? 这是我要执行的操作的示例。
Klass.prototype = {
init: function() {
// do stuff
},
destroy: function() {
// delete the instance
}
};
k = new Klass
k.destroy()
console.log(k) // I want this to be undefined
我知道我不能使用destroy方法简单地做到this = undefined
,但是我认为我可以通过使用如下超时方法来解决:
destroy: function() {
var self = this;
setTimeout( function() {
self = undefined
}, 0)
}
我认为超时功能可以通过闭包中的self
来访问实例(确实如此),但这似乎不起作用。 如果我从该函数内部进行console.log(self)
,则会显示为undefined
,但是全局范围内的k
仍然是Klass
的实例。
有谁知道如何使这项工作?
k
是指向Klass
实例的引用。 当您将destroy
作为Klass
的方法调用时,函数内部的this
绑定到您调用了destroy
方法的对象上。 现在,它是对Klass
实例的另一个引用。 您在该小闭合中闭合的self
又是对该实例的引用。 将其设置为undefined
将清除该引用,而不是其后面的实例。 您本身无法真正destroy
该实例。 您可以忘记它(将所有引用都设置为undefined
,就不会再找到它了),但是这已经足够了。
就是说,告诉我们您要完成的工作,我们很乐意帮助您找到解决方案。
尽管删除自己的对象实例是可能的,但这很俗气。 您可能想查看这篇文章。
您试图做的事是不可能的。 即使您覆盖this
它,也不会影响持有对该实例的引用的任何变量。 并且在其上调用函数仍然具有正确的this
。
您唯一可以做的就是在destroy
函数中设置一个变量,该变量将使其他函数在调用时引发异常。 但这是一个坏主意,因为它会使速度变慢(好了,这可以忽略不计),并且您可以在调用destroy()
之后再放入不再使用的类文档中。
这可行,但是要求您知道new Klass()
实例化到的变量名称是什么:
function Klass() {};
Klass.prototype = {
init: function() {
//
},
destroy: function() {
// Delete the variable that references the instance of the constructor.
delete window.k;
}
};
k = new Klass();
k.destroy();
console.log(k);
如果k
变量被命名为其他名称,它将不起作用:
// Won't work.
u = new Klass();
u.destroy();
它还假定局部变量k
确实在全局范围内。 如果它在一个函数中,那么它也不起作用。 例如:
// Won't work.
var fn = function() {
k = new Klass();
k.destroy();
};
最后,它假定window
对象的浏览器环境。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.