Мне понадобилось некоторое время, чтобы получить код, но потом он ударил меня: сам ключ используется для хранения ссылки на значение.
Например, несколько слоев в set
он делает
defProp(obj, globalID, { value: store });
, где defProp
был определен, чтобы быть Object.defineProperty
, obj
является ключом, globalID
является GUID и store
является объектом хранения, который содержит значение.
Тогда вниз в get
он ищет значение с
obj[globalID];
Это очень умный. В WeakMap фактически нет ссылки на что-либо (слабое или иное) - он просто устанавливает политику, в которой тайно хранить значение. Использование Object.defineProperty
означает, что вы случайно не обнаружите хранилище значений - вы должны знать волшебный указатель, чтобы посмотреть его.
Поскольку ключ напрямую относится к значению (и ссылка WeakMap не ссылается на него), когда все ссылки на ключ исчезли, он получает GCed, как обычно.
Рассмотрите возможность изучения исходного кода. – 2013-05-03 19:17:05
@squint Это делает что-то довольно глубокое - я не могу понять, как он не держит сильную ссылку на клавиши. Например, он не использует массивы. – paleozogt
WeakMaps - это функция ES6, которая позволяет связать данные с объектом, но все же пусть эти данные собираются в мусор, когда либо объект -OR- сам экземпляр WeakMap является собранным мусором. Это невозможно сделать без поддержки языков. Большинство прокладок WeakMap игнорируют часть, позволяющую передавать данные GC'd, когда сам экземпляр WeakMap является GC'd. – AgentME