删除自变异对象的实例

时间:2014-11-07 22:09:19

标签: javascript

拥有一个在用户请求上创建自身新实例的对象。我的问题是如何构建这个以及如何正确删除实例。

基本上是这样的:

(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()?或者......其他事情?

2 个答案:

答案 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中存储的引用,它就有资格进行垃圾回收,例如通过为其分配其他内容。