2012-11-13 61 views
2

這個問題類似於這個this之一,除了我不想在chrome代碼中執行此操作。不保存對象在javascript中的引用列表

在javascript中(在瀏覽器中運行)我想跟蹤所有使用特定構造創建的對象。很簡單,我能做到這一點是這樣的:

var listObjects = []; 

function Object() { 
    listObjects.push(this); 
} 

Object.prototype = { 
    // class members 
}; 

這是很好的,但對象保持甚至當他們不再使用(垃圾收集讓他們因爲在listObjects仍有參考)創建內存泄漏。現在,我可以添加一個「removeObject」函數,從列表中刪除一個對象,但這需要用戶在對象超出範圍時手動調用。 現在,這可以解決,如果

  1. 會有弱引用
  2. 人能找出多少引用有一個對象
  3. 一個可以定義的自動調用析構函數

Unfortantly ,根據我的研究,這些都沒有存在於JavaScript中(至少不是當它應該在瀏覽器中運行時)。

任何人都可以想到另一種方式做到這一點,在JavaScript中工作,或一些JavaScript功能,我錯過了可以用來做到這一點?

回答

1

我不認爲在JavaScript中對此有任何語言支持,或者對弱引用有任何支持,至少在瀏覽器環境中不支持。

但是,你可以嘗試的東西(漂亮,漂亮,漂亮的醜陋......)讓您的一個function Object()覆蓋的想法,但有其寫入到一個無形的<div>屏幕上的物體的細節追蹤。

你去那裏:追蹤沒有保存對象的實際參考。但是你仍然需要實現一些查詢功能來從該div中檢索信息並且隨時清除它,否則你也會發生泄漏。

或者你可以做你的建議:創建一個通用構造函數和一個通用析構函數,但是這需要你明確地調用它們來從列表中移除對象。但是如果發生意外,你的析構函數將不會被調用,所以你可能會以非預期的方式泄漏很多。

想知道別人是否能想到替代品。

+0

如何將我的對象寫入div幫助我以任何其他方式添加到數組/列表中? – Nathan

+0

@Nathan:這對你沒有任何幫助。它可以幫助你以完全相同的方式(來跟蹤對象),但**沒有**這些對象仍然被引用的問題,並且不適合垃圾收集。這並不理想,但那會奏效。 – haylem