2017-08-30 101 views
1
class Cat { 

    storage = new Map() 

    constructor(id) { 
    if(storage.has(id)) return storage.get(id) 
    storage.set(id, this) 
    } 

} 

我想要從存儲中刪除對象,如果在應用程序中不使用它的引用。但是,如果應用程序中的鏈接存在,並且我們試圖創建具有相同ID的對象,則返回此對象,而不是創建一個新對象。我怎麼能沒有析構函數呢?WeakMap模式Singleton沒有內存泄漏

但是,當所有的對象引用從應用程序和對象從存儲去除消失,再沒有什麼不好的創建對象的新實例

+0

所以當有與應用程序ID'c1'一個'Cat'對象的參考,你想要什麼?從地圖中刪除它,下次使用'new Cat(「c1」)'創建一個新對象? –

+0

@Koushik Chatterjee是的,它始終需要具有唯一標識的對象是同一個對象/但是當對象的所有引用都從應用程序中消失,並且從存儲中移除對象時,創建新實例沒有任何壞處對象 – Maxmaxmaximus

+0

這是在Node還是瀏覽器中運行? –

回答

0

的Javascript不支持此功能。我想出了一個解決辦法:

在每個對象構造的,我們通過一個加鏈接的數量,以及與每個解構,我們減少一個鏈接的數量。當鏈接數量爲零時,我們手動從存儲中刪除對象。

class Cat { 

    storage = {} 


    constructor(id) { 
    if(storage[id]) { 
     var cat = storage[id] 
     cat.links++ 
     return cat 
    } 

    storage[id] = this 
    this.links = 1 
    } 


    destroy() { 
    if(--this.links) { 
     delete storage[this._id] 
    } 
    } 

} 

用法:

cat1 = new Cat('id') 
cat2 = new Cat('id') 

cat1 === cat2 // true 
cat1.destroy() // storage NOT empty 
cat2.destroy() // storage is empty