如何在原型函数中删除实例是JavaScript

时间:2012-05-31 00:34:55

标签: 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的实例。

有谁知道如何使这项工作?

4 个答案:

答案 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对象的浏览器环境。