Javascript 删除自变异对象的实例

Javascript 删除自变异对象的实例,javascript,Javascript,拥有一个根据用户请求创建自身新实例的对象。我的问题是关于如何构造它,主要是如何正确地删除实例 基本上是这样的: (function (something) { var collection = {}, counter = -1; function remove(ix) { delete collection[ix]; } function Foo() { collection[++counter] = this;

拥有一个根据用户请求创建自身新实例的对象。我的问题是关于如何构造它,主要是如何正确地删除实例

基本上是这样的:

(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();
使用这种方法是否可以正确删除“自行创建”的实例?(如将来某个时候收集的GB)有更好的方法解决这个问题吗

我可以说:

delete collection[ix];
remove()
函数中?或者,调用
remove()
时是否必须使用
setTimeout()
?或其他事情?

你做的很好

执行
delete collection[ix]
collection[ix]=null
都将消除对
collection[ix]
值的引用

当然,如果要枚举
collection
的属性,最好使用
delete
,因为对象现在将从列表中删除。如果仅将其设置为
null
,则该值仍将作为
集合的属性存在:

设置为
null

collection["x"] = 1
collection["x"] = null;
console.log(collection)// { x: null }
vs
删除

collection["x"] = 1
delete collection["x"]
console.log(collection)// {}
是的,“自行创建”的实例只要没有引用,就有资格进行垃圾收集

使用代码
var bar=new Foo()创建
Foo
的新实例时,您正在创建对实例的两个引用:一个在函数闭包的作用域中(分配给
集合
的属性),一个在全局作用域中(分配给


调用
bar.remove()时
,您将删除存储在
集合中的引用。除非您创建对该实例的其他引用,否则只要删除存储在
bar
中的引用,该实例就有资格进行垃圾收集,例如,通过为其分配其他对象。

如果要从
集合中删除它们,并且代码中其他地方没有其他引用,则垃圾收集器将清理它们<代码>删除集合[ix]
可以很好地从
集合
中删除项目,只要
ix
是您在将项目添加到集合时在原始构造函数中使用的键。+1我希望看到关于这一点的详细答案很好。我也很怀疑,但必须得到证实。谢谢。看看代码,我想我可以向公众添加一个小启动器,而不是
Foo
。成为一个关于是否需要访问主对象的问题。现在我看不到任何变化,如果需要的话,很容易改变。