我想要一个Flyweight对象,所以我创建了一个Object并将其实例存储在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值时,它仍在内存中,并存储在此Map中。
由于如果不再使用WeakMap和WeakSet,则应该让垃圾收集器将其清除,那么我该如何编写一个构造函数以返回WeakSet或WeakMap中的对象,或者如果不再存储该对象,则创建一个新对象?
最佳答案
您正在寻找soft reference来实现您的号码缓存。不幸的是,JS没有这些。
而且它的WeakMap
也不创建弱引用,实际上是ephemeron。它不允许您观察是否已收集对象。
关于javascript - 具有WeakMap或WeakSet的Javascript Flyweight,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/50426282/