Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何删除javascript对象(John Resig-简单继承)?_Javascript_Oop - Fatal编程技术网

如何删除javascript对象(John Resig-简单继承)?

如何删除javascript对象(John Resig-简单继承)?,javascript,oop,Javascript,Oop,我的代码: myobj = new Object(); classes.testegy = Class.extend({ init: function (token) { console.log("test egy"); setInterval(function () { console.log('hello'); }, 300); }, testt: function () { co

我的代码:

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时,请使用单击和控制台日志

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();

}   
});

return:1 click event->4x click=4x console log:(它是由4个shadow对象创建的。

您需要定义清理功能。首先,保持对
setInterval
的引用:

init: function(token){
    console.log("test egy");
    this.interval = setInterval(function() { console.log('hello'); }, 300);
}
然后定义清洗功能(在原型中):

最后在删除之前调用
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”)。取消绑定('click')。单击(/*handler*/)
内部
init


顺便说一句,
.live
方法已经过时。现在使用
.on

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

如果我删除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);
}

您还需要调用
clearInterval
cleanup: function() {
    clearInterval(this.interval);
}