繁体   English   中英

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM