Объект WeakMap
представляет собой набор пар ключ/значение, в котором на ключи слабо ссылаются. Ключи должны быть объектами, а значения могут быть произвольными значениями.
Давайте поговорим о том, что у нас есть класс person и имя свойства.
Вот пример,
class Person { constructor(name) { this.name = name; } } let Person1 = new Person("John"); console.log(Person1); // Person { name: 'John' } console.log(Person1.name); // John
Нам нужно иметь приватную переменную в Javascript, чтобы это имя не имело доступа извне.
Как мы можем это сделать?
Одним из решений было бы поставить подчеркивание, например,
class Person { constructor(name) { this._name = name; } } let Person1 = new Person("John"); console.log(Person1); // Person { name: 'John' } console.log(Person1.name); // Undefined
Это приносит с собой вечную борьбу, чтобы предупредить всех, что подчеркивание нельзя изменить или коснуться.
Другим решением было бы использование типа данных Symbol(),
let s_name = Symbol(); class Person { constructor(name) { this[s_name] = name; } } let Person1 = new Person("John"); console.log(Person1); // Person { name: 'John' } console.log(Person1.name); // Undefined
Проблема в том, что символы выставляются с помощью таких методов, как Object.getOwnPropertySymbols(),
let symbols = Object.getOwnPropertySymbols(Person1); console.log(Person1[symbols[0]]); // John
Но самый простой вариант,
новая WeakMap([iterable]);
У этого объекта один аргумент (итерируемый)
итерируемый –> необязательно. Iterable — это массив или другой итерируемый объект, элементами которого являются пары "ключ-значение" (двухэлементные массивы). Каждая пара ключ-значение будет добавлена в новую WeakMap. null рассматривается как неопределенный.
Итак, давайте создадим нашу WeakMap,
class Person { constructor(name) { let weakmap = new WeakMap(); weakmap.set(this, { name: name }); } } let Person1 = new Person("John"); console.log(Person1); // Person {} console.log(Person1.name); // Undefined
Основные отличия от объекта Map:
- WeakMap — это только наборы объектов.
- Если на объект элемента не осталось никакой другой ссылки, он будет автоматически отправлен в сборщик мусора.
- По предыдущей причине вы не можете перебирать объекты внутри WeakMap.
- По предыдущей причине вы не можете знать размер объектов внутри WeakMap.
- Вы можете использовать только .set(), get(), .has() и .delete(). методы с помощью WeakMap.
WeakMaps могут быть особенно полезными конструкциями при сопоставлении ключей с информацией о ключе, которая является ценной только в том случае, если ключ не подвергался сборке мусора.
Ссылки на другие мои работы вы можете найти на Medium и подписаться на меня здесь.
Я часто делюсь советами по программированию в моем Instagram, вы можете поздороваться со мной в моем Twitterили посмотреть, как я программирую в моем Гитхаб.
Большое спасибо и продолжайте кодировать!!!
Йоэль