在删除对象之前运行Javascript清理代码?
我认为这是不可能的,但我想我还是会问的。例如,假设我有一个构造对象,该对象在其作用域中与另一个[private]变量紧密耦合:在删除对象之前运行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
(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
是数组,每个对象的数据存储在适当的索引中。