如果我有一个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
的实例。
有谁知道如何使这项工作?
答案 0 :(得分:3)
k
是指向Klass
的实例的引用。当您将destroy
作为Klass
的方法调用时,函数内的this
将绑定到您调用destroy
方法的对象。它现在是对Klass
实例的另一个引用。您在该小闭包中关闭的self
是对该实例的另一个引用。当您将其设置为undefined
时,您清除该引用,而不是它背后的实例。你实际上不能destroy
这个实例本身。你可以忘记关于它(设置所有对undefined
的引用,你将不会再找到它),但这是你可以去的。
那就是说,告诉我们你想用这个来完成什么,我们很乐意帮助你找到解决方案。
答案 1 :(得分:1)
虽然可以删除自己的对象实例,但它非常俗气。您可能需要查看this文章。
答案 2 :(得分:0)
你要做的事是不可能的。即使您覆盖this
,它也不会影响任何持有该实例引用的变量。调用它上面的函数仍然会有正确的this
。
你唯一能做的就是在destroy
函数中设置一个变量,使其他函数在调用时抛出异常。但这可能是一个坏主意,因为它会减慢速度(好吧,这可以忽略不计),你可以在你的类的文档中加入destroy()
被调用后不再使用它的文档。 / p>
答案 3 :(得分:0)
这样可行,但它要求您知道实例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
对象的浏览器环境。