Javascript Flyweight с WeakMap или WeakSet - PullRequest
0 голосов
/ 19 мая 2018

Мне нужен объект Flyweight, поэтому я создал объект и сохранил его экземпляры на карте следующим образом:

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 или создатьновый объект, если он больше не хранится?

1 Ответ

0 голосов
/ 19 мая 2018

Вы ищете мягкую ссылку для реализации вашего кэша номеров.К сожалению, у JS их нет.

И его WeakMap тоже не создает слабых ссылок, на самом деле это эфемерон .Он не позволяет вам наблюдать, был ли объект собран.

...