2014-01-31 81 views
0

在JavaScript中銷燬「class」實例的適當方式是什麼?我使用節點「需要」我的類和它的原型。而且我注意到,將該類的實例設置爲等於null似乎並未實際銷燬該實例。試圖摧毀它的「class」實例仍然存在?

如:

function coolClass(){ 
    this.bob = 'Hey, this is Bob. I should be destroyed, right?!'; 
    this.init(); 

    console.log('Cool class has been initialized!'); 
} 

coolClass.prototype.init = function(){ 
    var self = this; 
    this.culprit = setInterval(function(){ 
     console.log(self.bob); 
    },1000); 
} 

exports.coolClass = coolClass; 

創建&試圖摧毀實例

var coolClass = require('coolClass'); 

var instance = new coolClass(); 

setTimeout(function(){ 
    instance = null; 
},5000); 

我的期望是,一旦定時器的功能是跑了,在coolClass實例將是destro YED;但是,似乎我錯了。

關於如何完全刪除實例的任何想法?

謝謝!

回答

1

將類的實例設置爲等於null似乎並未實際銷燬該實例。

你只是拋棄你的引用(變量)到實例。然而,封閉傳遞到setInterval仍然有一個,所以它不是garbage collected

關於如何徹底刪除實例的任何想法?

您將需要通過

clearInterval(instance.culprit); 

,然後停止區間,只要instance超出範圍,垃圾收集器將完成它的工作。

+0

那麼清除類中的所有間隔和超時,然後將實例變量設置爲'null'? – Justin

+0

是的,刪除所有仍然引用它的異步回調,並刪除對它的所有其他引用。大多數情況下,你不需要明確地將其設置爲'null',因爲當函數退出時變量剛剛超出範圍。 – Bergi

+0

謝謝!現在完美的工作! – Justin

0
> var instance = new coolClass(); 

創建coolClass的一個新實例並分配參考它作爲實例的值。

> instance = null; 

替換實例與null,它不會做任何事情到原來由例如引用的對象,這將持續至少只要東西存在都有它的一個引用(例如傳遞給setTimeout的函數)。

之後的某個時候,可能會在主機環境的異想天開垃圾收集。

+0

感謝您的回答!這是解決方案;然而,Bergi似乎首先發布了它。每當我贏得我的聲望以積極參與時,我會回來並提高您的答案。對此,我真的非常感激! – Justin