在删除对象之前运行Javascript清理代码?

时间:2015-09-28 18:34:07

标签: javascript constructor

我不认为这是可能的,但我想我还是会问。例如,假设我有一个构造对象与其范围内的另一个[private]变量紧密耦合:

(function() {

    var coupledVariable = "test", id = 0;
    function Constructor() { this.id = id++; }
    Constructor.prototype.talk = function() {
        if (this.id === 0) { console.log(coupledVariable); }
        else { console.log("something else"); }
    };
    var c = new Constructor();
    c.talk(); // "test"
    new Constructor().talk(); // "something else"
    delete c;

})();

当第一个对象coupledVariable被删除时,我是否还可以自动删除c,因为它只与该对象相关。我喜欢将它与构造函数分开,因为这样它是私有的(即通过函数除外是不可访问的),但这意味着当删除对象时它不会被垃圾收集。如果有一个"删除"那就太好了。在删除对象之前运行的事件侦听器,我可以放置一些代码,但我认为没有。

2 个答案:

答案 0 :(得分:1)

你是对的,这是不可能的。 JavaScript中没有析构函数 - you cannot delete instances anyway

  

我喜欢将它与构造函数分开,因为这样它是私有的(即通过函数除外不可访问)

你仍然可以在构造函数中保持私有:

var id = 0;
function Constructor() {
    this.id = id++;
    if (this.id === 0) {
        var coupledVariable = "test";
        this.talk = function() {
            console.log(coupledVariable);
        };
    }
}
Constructor.prototype.talk = function() {
    console.log("something else");
};

答案 1 :(得分:1)

为什么不在该原型上编写自己的函数(比如Constructor.prototype.delete)。并在每次需要删除私有对象并删除私人数据时调用它。

我建议你维护一个对象var coupledVariable = {};和里面的数据。这样你就可以删除该对象上的密钥。如果你也将对象实例存储在一个对象(一个名称空间)中,那么删除可能会在对象实例上工作,否则就像Bergi所提到的那样,你不能真正删除对象实例。