Примитивный тип данных Simbol

Symbol - примитивный тип данных, экземпляры которого уникальны и неизменяемы и могут быть использованы как ключ (идентификатор) для свойства объекта.

Примитивные значения иммутабельны: их нельзя изменять.

Symbol — это уникальное примитивное значение: создание нескольких экземпляров символов приведёт к созданию разных значений, например:

При создании экземпляра Symbol можно воспользоваться необязательным первым аргументом (тип number или string), который представляет собой описание символа, предназначенное для использования при отладке (на сам Symbol это значение не влияет):

Symbol как ключи (идентификаторы) свойств объектов

Символы можно использовать в качестве ключей свойств объектов, что позволяет получить уникальные идентификаторы для свойств объекта, например:

Ключи, заданные с помощью Symbol, не возвращаются при вызове метода Object.keys(), но могут быть получены с помощью метода Reflect.ownKeys() (можно получить список всех ключей объекта, и тех, что являются строками, и тех, что являются Symbol):

Ключи, заданные с помощью Symbol,  не всегда обеспечивают полную приватность данных в объекте.

Примеры

Ещё пример:

[свернуть]

Использование Symbol для предотвращения коллизий имён свойств объектов

Symbol позволяют добавлять в объекты свойства, описанные за пределами этих объектов, при этом не опасаясь коллизии (конфликта) ключей (идентификаторов).

Пример коллизии имен свойств объекта (функция перезаписывает поле объекта, созданное другой функцией):

Если же воспользоваться при создании ключей свойств Symbol, то это позволит сгенерировать уникальные идентификаторы:

Symbol и JSON.Stringify()

JSON-представление объекта не содержит значения Symbol, т.к. новый тип данных JavaScript не внесен в спецификацию JSON (JSON поддерживает в качестве ключей свойств объектов только строки), например:

* про UUID и GUID можно почитать, например, здесь.

Скрыть строковые представления имён свойств в JSON-представлении объекта можно, благодаря использованию Object.defineProperty():

Строковые ключи, «скрытые» благодаря установке их дескриптора enumerable в значение false, ведут себя практически так же, как и ключи, представленные Symbol:

  • не выводятся при вызове Object.keys();
  • их можно обнаружить, воспользовавшись Reflect.ownKeys() (их нельзя назвать по-настоящему приватными).

Имитация приватных свойств с помощью Proxy и  Symbol

См. также Прокси (developer.mozilla.org) и Proxy и Reflect  (learn.javascript.ru)

Объект Proxy позволяет создать прокси для другого объекта, может перехватывать и переопределить основные операции для данного объекта. Т.е. прокси-объекты служат обёртками для других объектов и позволяют вмешиваться в действия, выполняемые с этими объектами.

Прокси - это новые объекты: невозможно выполнить "проксирование" существующего объекта.

Синтаксис создания прокси:

var p = new Proxy(target, handler);

где:

  • target - исходный объект (может быть объектом любого типа, включая массив, функцию и даже другой прокси объект);
  • handler - объект-обработчик, методы (ловушки) которого определяют поведение прокси во время выполнения операции над ним.

Прокси-объект предоставляет возможность управления операциями чтения ключей объекта., т.е., например, мы можем использовать прокси для управления видимостью свойств объекта извне.

Пример отсюда Особенности использования типа данных Symbol в JavaScript

 

Добавить комментарий

Этот сайт использует Akismet для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.