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