2017-08-30 52 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