2017-08-30 4 views
1
class Cat { 

    storage = new Map() 

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

} 

アプリケーションへの参照がアプリ​​ケーションで使用されていない場合は、オブジェクトをストレージから削除します。しかし、アプリケーション内のリンクが存在し、同じIDを持つオブジェクトを作成しようとしている場合は、新しいオブジェクトを作成するのではなく、このオブジェクトを返します。どのように私はデストラクタなしでそれを行うことができますか?WeakMapパターンメモリリークのないシングルトン

しかし、ときにオブジェクトへのすべての参照がアプリ​​ケーションから消え、そしてオブジェクトはストレージから削除し、

+0

アプリケーション内のid 'c1'と' Cat'オブジェクトへの参照が存在しないときに、あなたは何をしたいですか?それをマップから削除し、次回に 'new Cat(" c1 ")'で新しいオブジェクトを作成しますか? –

+0

@ Koushik Chatterjeeはい、オブジェクトの一意なIDを持つオブジェクトは常に同じオブジェクトにする必要があります。ただし、オブジェクトへの参照がすべてアプリケーションから消え、オブジェクトがストレージから削除されても、新しいインスタンスを作成することはできませんオブジェクトの – Maxmaxmaximus

+0

これはノードまたはブラウザで実行されていますか? –

答えて

0

Javascriptがこの機能をサポートしていませオブジェクトの新しいインスタンスを作成するには、悪いものは何もありません。私は回避策を思いついた:

各オブジェクトの構築では、リンクの数を1つ増やし、各分解でリンクの数を1つ減らします。リンクの数がゼロの場合は、手動でストレージからオブジェクトを削除します。

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 
関連する問題