我怎样才能删除javascript对象(John Resig - 简单继承)?

时间:2012-06-27 15:04:51

标签: javascript oop

我的代码:

myobj = new Object();
classes.testegy = Class.extend({
    init: function (token) {
        console.log("test egy");
        setInterval(function () {
            console.log('hello');
        }, 300);
    },
    testt: function () {
        console.log("luli");
    }
});
classes.testketto = Class.extend({
    init: function (token) {
        console.log("test ketto");
    }
});
classes.site = Class.extend({
    init: function (token) {
        var myobj = new Object();
        myobj.lel1 = new classes.testegy();
        myobj.lel2 = new classes.testketto();
        console.log(myobj);
        delete myobj.lel1;
        myobj.lel1.testt();
    }
});
var class = new classes.site();

如果我删除了myobj.lel1对象,它将被删除,但是setInterval会进入testegy类。为什么?我怎样才能完全删除对象?感谢

编辑:

一些例子,当不使用setInterval时,使用click和console log。

classes.testegy = Class.extend({
init: function(token){
    console.log("test egy");
    $(".piii").live("click", function() {
        console.log("hello");
    });

},
foo: function() {
    console.log("pina");
}
});

classes.testketto = Class.extend({
init: function(token){
    console.log("test ketto");
}   
});

classes.site = Class.extend({
init: function(token){
    var myobj = new Object();

    myobj.lel1 = new classes.testegy();
    myobj.lel2 = new classes.testketto();

    console.log(myobj);

    delete myobj.lel1;
    myobj.lel1 = new classes.testegy();
    delete myobj.lel1;
    myobj.lel1 = new classes.testegy();
    delete myobj.lel1;
    myobj.lel1 = new classes.testegy();

}   
});

返回:1次点击事件 - > 4x click = 4x控制台日志:(它创建了4个阴影对象。

3 个答案:

答案 0 :(得分:2)

您需要定义清洁功能。首先,保留对setInterval

的引用
init: function(token){
    console.log("test egy");
    this.interval = setInterval(function() { console.log('hello'); }, 300);
}

然后定义清洁功能(在原型中):

clean: function() {
    clearInterval(this.interval);
}

最后在删除之前调用myobj.lel1.clean()

修改

编辑后的代码存在问题。看看这个:

init: function(token){
    console.log("test egy");
    $(".piii").live("click", function() {
        console.log("hello");
    });
}

每当初始化新对象时,此功能会在.piii上添加新处理程序以点击事件。你要做的就是使用这段代码:

$(".piii").live("click", function() {
    console.log("hello");
});

在对象定义之外。或者您可以在$(".piii").unbind('click').click(/* handler */)内使用init

顺便说一句。 .live方法已过时。立即使用.on

答案 1 :(得分:0)

setInterval返回计时器的标识符,然后可以通过clearInterval来停止它。您需要在销毁对象之前调用clearInterval

答案 2 :(得分:0)

  

如果我删除myobj.lel1对象,它将被删除,但是   setInterval进入testegy类。为什么呢?

因为delete运算符只是删除了对象的引用,然后垃圾收集器在某个时刻释放了该对象所在的内存。虽然删除间隔的唯一方法是使用clearInterval方法,如下所示:

...
init: function(token){
    console.log("test egy");
    this.interval = setInterval(function() { console.log('hello'); }, 300);
},
...

//then before calling delete you need to call clearInterval
clearInterval(obj.interval);
obj = null;

或者您可以将所有清理包含在单独的方法中:

cleanup: function() {
    clearInterval(this.interval);
}