- Возможность записи, перечислимый, настраиваемый, значение, получение и установка

В интервью меня спросили о атрибутах (или) дескрипторах, которые по своей сути будут иметь каждое свойство объекта. Я понятия не имел, о чем говорил интервьюер, но интервьюер был достаточно любезен, чтобы объяснить мне, что они из себя представляют. В целом интервью прошло успешно, но я очень хотел узнать больше, и один из способов полностью понять тему - написать о ней:

Каждое свойство объекта - это больше, чем просто имя и значение. Чтобы понять это, давайте рассмотрим простой объект car:

У первичного конструктора Object есть метод, который позволяет нам просматривать все дескрипторы любого свойства объекта. Например, вы можете просмотреть дескрипторы свойства марка объекта автомобиль , вызвав:

Это войдет в консоль:

Объект {значение: «Audi», доступно для записи: true, enumerable: true, configurable: true}

Здесь мы видим, что у самого свойства brand есть еще четыре дескриптора, а именно: значение, записываемое, перечисляемое и настраиваемое. А и их значения истинны по умолчанию .

Возможность записи:

Writable, наверное, самый простой. Это значение указывает, можно ли изменить значение свойства. Мы можем установить доступное для записи значение, используя метод defineProperty функции Object:

Это делает собственность бренда недоступной для записи. А теперь, если мы попытаемся изменить ценность бренда, например, сказав car [brand] = ‘Maserati’, возникнет исключение.

Примечание. Чтобы JavaScript действительно распознавал исключение, необходимо включить "use strict".

Однако, если значение свойства само по себе является другим объектом, это не сработает. Чтобы проиллюстрировать это, давайте добавим еще одно свойство Dimension к объекту car с объектом в качестве его значения, как показано ниже.

измерение здесь просто ссылка, а JavaScript только не позволяет нам изменить эту ссылку и не помешает нам изменить свойства объекта, на который эта ссылка указывает. Чтобы сделать сам объект недоступным для записи, мы можем использовать метод замораживания объекта следующим образом:

Это предотвращает изменение объекта.

Перечислимый:

Дескриптор enumerable довольно мощный и полезный в тех случаях, когда вы не хотите перебирать определенные свойства. Дескриптор enumerable, если для свойства задано значение false, будет скрывать его при переходе по всем свойствам с использованием цикла for… in. Он также скрывает свойство из списка ключей, полученного с помощью Object.keys (car), и не будет отображаться во время сериализации JSON с помощью JSON.stringify (car ) тоже. Чтобы установить для Dimension значение false, мы делаем:

Настраиваемый:

Если для свойства configurable установлено значение false, оно блокирует это свойство и предотвращает изменение enumerable и даже configurable. Это также предотвращает удаление этого свойства. Однако доступный для записи все еще можно изменить. Чтобы заблокировать бренд, мы можем:

Ценить:

Значение - это просто значение, связанное со свойством. По умолчанию undefined.

Приготовься:

Здесь мы определили новое свойство «DimensionList» с дескрипторами get & set. Мы могли бы просто создать новое свойство 'DimensionList' традиционным способом, используя оператор точки, но, определив его с помощью метода defineProperty, мы неявно установили configurable и enumerable в false, просто не указав их здесь. Напомним, что они истинны по умолчанию в обозначении объектных литералов.

Метод get возвращает размеры в виде строки, разделенной запятой. А метод set принимает строку, разделенную запятыми, как показано выше, и устанавливает значения длины измерения и ширины. Еще одна важная вещь, на которую следует обратить внимание: как только вы определяете методы get / set, свойство становится так называемым дескриптором доступа . И вы больше не можете вручную определять дескрипторы значение / запись. Это верно и для другого случая: если существуют дескрипторы значение / запись, тогда не может быть атрибутов get / set. В этом случае свойство называется дескриптором данных.

Справка: Документы Mozilla