Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/452.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在删除对象之前运行Javascript清理代码?_Javascript_Constructor - Fatal编程技术网

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

在删除对象之前运行Javascript清理代码?,javascript,constructor,Javascript,Constructor,我认为这是不可能的,但我想我还是会问的。例如,假设我有一个构造对象,该对象在其作用域中与另一个[private]变量紧密耦合: (function() { var coupledVariable = "test", id = 0; function Constructor() { this.id = id++; } Constructor.prototype.talk = function() { if (this.id === 0) { console

我认为这是不可能的,但我想我还是会问的。例如,假设我有一个构造对象,该对象在其作用域中与另一个[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;

})();

当第一个对象
c
被删除时,是否有一种方法可以自动删除
coupledVariable
,因为它只与该对象相关。我喜欢将它与构造函数分开,因为这样它是私有的(即不可访问,除非通过函数),但这意味着在删除对象时它不会被垃圾收集。如果在删除对象之前运行一个“delete”事件侦听器,我就可以在其中放置一些代码,但我认为没有。你说得对,这是不可能的。JavaScript和中没有析构函数

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

您仍然可以在构造函数中保持它的私有性:

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");
};

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


我建议您维护一个对象var coupledVariable={};以及里面的数据。这样您就可以真正删除该对象上的键。若您也将对象实例存储在一个对象(namepsace)中,那个么delete可能对对象实例起作用,否则正如Bergi所提到的,您不能像这样真正地删除对象实例

事实上,
coupledVariable
在最后一个语句之后就超出了范围,没有必要“删除”它。@Bergi是的,这只是一个非常简单的非真实世界的例子,也许不是最好的例子来说明我的观点。但是为了论证,假设在超出范围之前我又创建了数千个这样的对象,
coupledVariable
,而不仅仅是一个字符串,而是一个数组,它以相当于
this.id
的索引存储大量数据。在这种情况下,如果在删除对象时不删除存储在相关数组索引中的数据,可能会浪费大量内存。我知道这种保持事物私有的方法,但这消除了使用原型的好处(即为每个对象创建一个新函数,而不是仅依赖一个)。但如果不可能,那就不可能!谢谢。好吧,考虑到你想要每个对象的隐私,你必须创建它:-)足够公平。实例化的对象也不能被删除似乎很奇怪,但如果语言是这样的话,那就这样吧。我链接的文档说
delete
关键字用于属性,与内存管理无关。不过,实例化的对象不能被显式删除,JS是一种自动垃圾收集语言。只要销毁所有对对象的引用,它们就消失了。谢谢,这是一种选择。我只需要记住使用我自己的函数,但不要太麻烦。是的,在我实际编写的代码中,而不是我在这里给出的示例中,
this.id
用作数组索引,
coupledVariable
是数组,每个对象的数据存储在适当的索引中。