简体   繁体   English

具有WeakMap或WeakSet的Javascript Flyweight

[英]Javascript Flyweight with WeakMap or WeakSet

I want a Flyweight object so I created an Object and stored it's instances in a Map like this: 我想要一个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;

The problem is that when I'm not using a FlyweightNumber value anymore it is still in memory, stored in this Map. 问题是,当我不再使用FlyweightNumber值时,它仍在内存中,并存储在此Map中。

Since WeakMap and WeakSet are supposed to let garbage colector clear it if it is not used anymore, how could I write a constructor to return the object in the WeakSet or WeakMap or create a new object if it is not stored anymore? 由于如果不再使用WeakMap和WeakSet,应该让垃圾收集器将其清除,那么我该如何编写一个构造函数以返回WeakSet或WeakMap中的对象,或者如果不再存储该对象,则创建一个新对象?

You're looking for a soft reference to implement your number cache. 您正在寻找实现号码缓存的软参考 Unfortunately, JS doesn't have these. 不幸的是,JS没有这些。

And its WeakMap doesn't create weak references either, it's an ephemeron actually. 而且它的WeakMap也不会创建弱引用,实际上是一个星历表 It does not allow you to observe whether an object has been collected. 它不允许您观察是否已收集对象。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 如何在 Javascript 中克隆“WeakMap”或“WeakSet”? - How do I clone a “WeakMap” or “WeakSet” in Javascript? ES6 Set、WeakSet、Map 和 WeakMap - ES6 Set, WeakSet, Map and WeakMap 将对象添加到 WeakSet 或 WeakMap 是否可以检测到以任何方式改变该对象? - Does adding an object to a WeakSet or WeakMap detectably alter that object in any way? 带有 WeakMap 的 JavaScript 中的多个私有属性 - Multiple private properties in JavaScript with WeakMap JavaScript - 如何测试 WeakSet 的相等性? - JavaScript - How can I test the equality of WeakSet? 当 .size 不存在时,在 Node.js 中尝试从 WeakSet/WeakMap(通过垃圾收集)自动删除的项目? - Experimenting with auto-removed items from WeakSet/WeakMap (via garbage collection) in Node.js when .size doesn't exist? 具有对象/数组的Javascript Set / WeakSet数据结构 - Javascript Set/WeakSet datastructures with objects/arrays JavaScript WeakMap 不断引用 gc 对象 - JavaScript WeakMap keep referencing gc'ed objects 如何在 Javascript 中观察 WeakMap 的垃圾收集? - How to observe garbage collection of a WeakMap in Javascript? @ types / node / index.d.ts(6208,55):错误TS2304:找不到名称'Map''设置''符号''弱地图''弱设置' - @types/node/index.d.ts(6208,55): error TS2304: Cannot find name 'Map' 'Set' 'Symbol' 'WeakMap' 'WeakSet'
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM