use*_*242 33 javascript class object
我试图弄清楚如何通过类方法删除对象.我希望能够创建一个具有destroy方法的类,该方法从内存中释放对象.到目前为止,我所做的研究尚无定论.我知道垃圾收集最终将处理对象,但我想要一种更明确的方法来摧毁它.这可能吗?
// class constructor
var class = function () {
this.destroy = function () {};
};
// instance
var instance = new class();
instance.destroy();
console.log(instance); // should be null or undefined
Run Code Online (Sandbox Code Playgroud)
Meh*_*ami 43
1-无法在javascript中实际销毁对象,但是使用delete,我们可以从对象中删除引用:
var obj = {};
obj.mypointer = null;
delete obj.mypointer;
Run Code Online (Sandbox Code Playgroud)
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;
Run Code Online (Sandbox Code Playgroud)
如上所述,设置storage.instance = null或delete storage.instance足以删除对象的引用并允许GC清除它.不同之处在于,如果将其设置为,null则存储对象仍具有名为instance的属性(值为null).如果您delete storage.instance然后存储对象不再具有名为instance的属性.
和什么破坏方法??
这里矛盾的一点是,如果你instance.destroy在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
Run Code Online (Sandbox Code Playgroud)
但如果我是你,我会坚持第一个解决方案并删除这样的对象:
storage.instance = null;
// OR
delete storage.instance;
Run Code Online (Sandbox Code Playgroud)
哇太多了:)
Jon*_*Jon 17
不会.JavaScript会自动收集垃圾; 仅当GC决定运行且对象符合收集条件时,才会回收对象的内存.
看到这将根据需要自动发生,明确回收内存的目的是什么?
您只能手动删除对象的属性。因此:
var container = {};
container.instance = new class();
delete container.instance;
Run Code Online (Sandbox Code Playgroud)
但是,这不适用于任何其他指针。所以:
var container = {};
container.instance = new class();
var pointer = container.instance;
delete pointer; // false ( ie attempt to delete failed )
Run Code Online (Sandbox Code Playgroud)
此外:
delete container.instance; // true ( ie attempt to delete succeeded, but... )
pointer; // class { destroy: function(){} }
Run Code Online (Sandbox Code Playgroud)
所以在实践中,删除只对删除对象属性本身有用,并不是从内存中删除它们指向的代码的可靠方法。
手动指定的destroy方法可以解除绑定任何事件侦听器。就像是:
function class(){
this.properties = { /**/ }
function handler(){ /**/ }
something.addEventListener( 'event', handler, false );
this.destroy = function(){
something.removeEventListener( 'event', handler );
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
85783 次 |
| 最近记录: |