Javascript 无内存泄漏的WeakMap模式单例

Javascript 无内存泄漏的WeakMap模式单例,javascript,memory-leaks,weakmap,Javascript,Memory Leaks,Weakmap,如果应用程序中未使用对该对象的引用,我希望将其从存储器中删除。但是如果应用程序中的链接存在,并且我们正在尝试创建具有相同ID的对象,则返回此对象,而不是创建新对象。没有析构函数我怎么做 但是,当所有对对象的引用从应用程序中消失,并且对象从存储中删除时,创建对象的新实例并没有什么不好的,Javascript不支持此功能。我想出了一个解决办法: 在每个对象构造时,我们将链接数增加一个,而在每次分解时,我们将链接数减少一个。当链接数为零时,我们手动从存储器中删除该对象 class Cat { s

如果应用程序中未使用对该对象的引用,我希望将其从存储器中删除。但是如果应用程序中的链接存在,并且我们正在尝试创建具有相同ID的对象,则返回此对象,而不是创建新对象。没有析构函数我怎么做


但是,当所有对对象的引用从应用程序中消失,并且对象从存储中删除时,创建对象的新实例并没有什么不好的,Javascript不支持此功能。我想出了一个解决办法:

在每个对象构造时,我们将链接数增加一个,而在每次分解时,我们将链接数减少一个。当链接数为零时,我们手动从存储器中删除该对象

class Cat {

  storage = new Map()  

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

}
用法:

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]
    }
  }

}

Javascript不支持此功能。我想出了一个解决办法:

在每个对象构造时,我们将链接数增加一个,而在每次分解时,我们将链接数减少一个。当链接数为零时,我们手动从存储器中删除该对象

class Cat {

  storage = new Map()  

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

}
用法:

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]
    }
  }

}

因此,当应用程序中没有对id为c1的
Cat
对象的引用时,您想要什么?将其从地图中删除,下次使用
new Cat(“c1”)
创建新对象时?@Koushik Chatterjee是的,具有唯一id的对象始终必须是同一个对象/但当对该对象的所有引用从应用程序中消失,并且对象从存储中删除时,那么,在节点或浏览器中创建对象的新实例并没有什么坏处吗?因此,当应用程序中没有对id为
c1
Cat
对象的引用时,您想要什么?将其从地图中删除,下次使用
new Cat(“c1”)
创建新对象时?@Koushik Chatterjee是的,具有唯一id的对象始终必须是同一个对象/但当对该对象的所有引用从应用程序中消失,并且对象从存储中删除时,那个么在节点或浏览器中创建新的object实例并没有什么不好的吗?