Подтвердить что ты не робот

Реализация WeakMap в EcmaScript5?

Я столкнулся с библиотекой JavaScript, которая реализует кросс-браузер WeakMap в ES5. (WeakMap для ES6.)

Как это возможно работать без поддержки на самом языке JavaScript?

Изменить: Чтобы быть ясным, я имею в виду карту Слабая, а не обычная карта. Я протестировал этот проект с помощью профайлера Chrome, и ключи не поддерживаются сильными ссылками. Они получают GC'ed без необходимости удалять их из WeakMap.

4b9b3361

Ответ 1

Мне потребовалось некоторое время, чтобы получить код, но потом он ударил меня: сам ключ используется для хранения ссылки на значение.

Например, несколько слоев в set он делает

defProp(obj, globalID, { value: store });

где defProp определено как Object.defineProperty, obj - это ключ, globalID - это guid и store - объект хранения, содержащий значение.

Затем вниз в get он просматривает значение с помощью

obj[globalID];

Это очень умно. В WeakMap фактически нет ссылки на что-либо (слабое или другое) - он просто устанавливает политику, в которой тайно хранить значение. Использование Object.defineProperty означает, что вы случайно не обнаружите хранилище значений - вам нужно знать волшебный указатель, чтобы посмотреть его.

Так как ключ напрямую ссылается на значение (и WeakMap не ссылается на него), когда все ссылки на ключ исчезли, он получает GCed как обычно.