WeakMap Pattern Singleton没有内存泄漏

时间:2017-08-30 15:16:56

标签: javascript memory-leaks weakmap

class Cat {

  storage = new Map()  

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

}

如果在应用程序中未使用对它的引用,我希望从存储中删除该对象。但是如果应用程序中的链接存在,并且我们尝试创建具有相同ID的对象,则返回此对象,而不是创建新对象。如何在没有析构函数的情况下做到这一点?

但是当对象的所有引用从应用程序中消失,并且对象从存储中删除时,那么创建对象的新实例没有什么不好的

1 个答案:

答案 0 :(得分: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