拥有一个在用户请求上创建自身新实例的对象。我的问题是如何构建这个以及如何正确删除实例。
基本上是这样的:
(function (something) {
var collection = {},
counter = -1;
function remove(ix) {
delete collection[ix];
}
function Foo() {
collection[++counter] = this;
this.index = counter;
this.load();
}
Foo.prototype.load = function () {
/* - Create some element and add it to DOM.
* - Add listeners for events.
* - If "New" is clicked call this.add()
* - If "Remove" is clicked call this.remove()
* */
};
Foo.prototype.add = function () {
var x = new Foo();
};
Foo.prototype.remove = function () {
/* - Remove listeners.
* - Remove element from DOM.
* */
remove(this.index);
};
something.Foo = Foo;
})(this);
var bar = new Foo();
使用这种方法是否可以正确删除" self created" 实例? (正如GB在未来某个时候收集的那样。)有没有更好的方法来解决这个问题?
我可以说:
delete collection[ix];
来自remove()
函数?或者,在调用setTimeout()
时是否必须使用remove()
?或者......其他事情?
答案 0 :(得分:1)
你做的很好。
执行delete collection[ix]
或collection[ix] = null
两者都会消除对collection[ix]
值的引用。
当然,如果您要对delete
的属性进行枚举,则使用collection
会更好,因为现在该对象将从列表中删除。如果您只是将其设置为null
,则该值仍将作为collection
的属性存在:
设置为null
:
collection["x"] = 1
collection["x"] = null;
console.log(collection)// { x: null }
vs delete
:
collection["x"] = 1
delete collection["x"]
console.log(collection)// {}
答案 1 :(得分:1)
是的,一旦没有对它们的引用,“self created”实例就有资格进行垃圾收集。
当您使用代码Foo
创建var bar = new Foo();
的新实例时,您将创建对该实例的两个引用:一个在函数闭包中的范围内(分配给{的属性的一个) {1}})和全局范围内的一个(分配给collection
的那个)。
当您致电bar
时,您将删除bar.remove();
中存储的引用。除非您创建对该实例的其他引用,否则只要删除collection
中存储的引用,它就有资格进行垃圾回收,例如通过为其分配其他内容。