1- 在JavaScript中,实际上没有办法销毁一个对象,但是可以使用delete
来从对象中移除一个引用:
var obj = {};
obj.mypointer = null;
delete obj.mypointer;
2- delete
关键词的重点是它实际上并不销毁对象,但是只有在删除指向同一对象的所有引用后,内存中没有其他指向该对象的引用,该对象才会被标记为可回收。 delete
关键字删除引用但不会垃圾回收实际对象。这意味着如果您有同一对象的多个引用,则仅在删除所有指向的引用后,该对象将立即被回收。
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)。如果您
delete storage.instance
,则存储对象不再具有名为instance的属性。
而
销毁方法呢?
这里的悖论点是,如果您在destroy函数中使用
instance.destroy
,则无法访问实际的
instance
指针,并且它不会让您删除它。
唯一的方法是将引用传递给destroy函数,然后将其删除:
var Class = function () {
this.destroy = function (baseObject, refName) {
delete baseObject[refName];
};
};
var storage = {};
storage.instance = new Class();
storage.instance.destroy(object, "instance");
console.log(storage.instance);
但是如果我是你,我会简单地坚持第一个解决方案并像这样删除对象:
storage.instance = null
// OR
delete storage.instance
哇,太棒了 :)