Ответ 1
Мне потребовалось некоторое время, чтобы получить код, но потом он ударил меня: сам ключ используется для хранения ссылки на значение.
Например, несколько слоев в set
он делает
defProp(obj, globalID, { value: store });
где defProp
определено как Object.defineProperty
, obj
- это ключ, globalID
- это guid и store
- объект хранения, содержащий значение.
Затем вниз в get
он просматривает значение с помощью
obj[globalID];
Это очень умно. В WeakMap фактически нет ссылки на что-либо (слабое или другое) - он просто устанавливает политику, в которой тайно хранить значение. Использование Object.defineProperty
означает, что вы случайно не обнаружите хранилище значений - вам нужно знать волшебный указатель, чтобы посмотреть его.
Так как ключ напрямую ссылается на значение (и WeakMap не ссылается на него), когда все ссылки на ключ исчезли, он получает GCed как обычно.