我正在尝试找出如何通过类方法删除对象。我希望能够创建一个具有从内存中释放对象的 destroy 方法的类。到目前为止,我所做的研究尚无定论。我知道垃圾收集最终会处理该对象,但我想要一种更明确的方法来销毁它。这可能吗?
// class constructor
var class = function () {
this.destroy = function () {};
};
// instance
var instance = new class();
instance.destroy();
console.log(instance); // should be null or undefined
最佳答案
1- 没有办法在 javascript 中实际销毁对象,但使用 delete
,我们可以从对象中删除引用:
var obj = {};
obj.mypointer = null;
delete obj.mypointer;
2- delete
关键字的重点是它实际上并没有销毁对象,但是如果仅在删除对该对象的引用之后,指向的内存中就没有其他引用了同一个对象,该对象将被标记为可收集的。 delete
关键字删除引用但不对实际对象进行 GC。这意味着如果您对同一个对象有多个引用,则在您删除所有指向的引用后,该对象将立即被收集。
3- 当我们想要确保不会遗留任何内存泄漏时,还有一些技巧和解决方法可以帮助我们解决问题。例如,如果您有一个包含多个对象的数组,没有任何其他指向这些对象的指向引用,那么如果您重新创建数组,所有这些对象都会被杀死。例如,如果您有 var array = [{}, {}]
覆盖数组的值,例如 array = []
将删除对内部两个对象的引用数组,这两个对象将被标记为可收集的。
4- 对于您的解决方案,最简单的方法就是这样:
var storage = {};
storage.instance = new Class();
//since 'storage.instance' is your only reference to the object, whenever you wanted to destroy do this:
storage.instance = null;
// OR
delete storage.instance;
如上所述,设置 storage.instance = null
或 delete storage.instance
都足以删除对对象的引用并允许它被清除GC。不同之处在于,如果将其设置为 null
,则存储对象仍然具有名为 instance 的属性(值为 null)。如果您删除 storage.instance
,则存储对象不再具有名为 instance 的属性。
和破坏方法是什么??
这里的矛盾点是,如果你在 destroy 函数中使用 instance.destroy
,你将无法访问实际的 instance
指针,并且它不会让你删除
唯一的方法是将引用传递给 destroy 函数,然后将其删除:
// Class constructor
var Class = function () {
this.destroy = function (baseObject, refName) {
delete baseObject[refName];
};
};
// instanciate
var storage = {};
storage.instance = new Class();
storage.instance.destroy(object, "instance");
console.log(storage.instance); // now it is undefined
但是如果我是你,我会简单地坚持第一个解决方案并像这样删除对象:
storage.instance = null;
// OR
delete storage.instance;
哇,太多了:)
关于JavaScript:通过类方法创建和销毁类实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21118952/