2012-06-27 78 views
0

我的代碼:如何刪除JavaScript對象(約翰Resig的 - 簡單的繼承)?

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

} 
}); 

回報:1個單擊事件 - > 4X點擊= 4X控制檯日誌:(創建它4陰影對象

+0

您還需要調用'clearInterval' –

回答

2

您需要定義清洗功能首先,按住參考setInterval

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

然後定義清洗功能(在原型):

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

最後CA在刪除之前,您需要輸入myobj.lel1.clean()

EDIT

在編輯的代碼的問題是不同的。看看這個:

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

+0

我編輯問題。 – user1485841

+0

@ user1485841我已經編輯了答案。 – freakish

+0

謝謝!大! :) – user1485841

0

setInterval返回計時器,其可以隨後通過clearInterval放停止它的標識符。你需要銷燬對象之前調用clearInterval

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; 

或者你可以incapsulate全部清理到單獨的方法:

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