我想要一个Flyweight对象,所以我创建了一个对象,并将其实例存储在Map中,如下所示:
const FlyweightNumber = (function(){
"use strict";
const instances = new Map();
class FlyweightNumber{
constructor(number){
Object.defineProperty(this, 'number', {
value: number
});
if(!instances.get(number)){
instances.set(number, this);
}
else {
return instances.get(number);
}
}
toString() {
return this.number;
}
valueOf(){
return this.number;
}
toJSON(){
return this.number;
}
}
return FlyweightNumber;
})();
module.exports = FlyweightNumber;问题是,当我不再使用FlyweightNumber值时,它仍然存储在内存中,存储在这个映射中。
既然WeakMap和WeakSet应该让垃圾收集器在垃圾收集器不再使用它时清除它,那么我如何编写构造函数来返回WeakSet或WeakMap中的对象,或者如果它不再被存储,则创建一个新对象呢?
发布于 2018-05-19 22:34:02
您正在寻找一个soft reference来实现您的号码缓存。不幸的是,JS没有这些。
它的WeakMap也不会创建弱引用,它实际上是一个ephemeron。它不允许您观察对象是否已被收集。
https://stackoverflow.com/questions/50426282
复制相似问题