Объекты JavaScript

Краткое введение в «Дескриптор свойства» объектов JavaScript

Вкратце, объект JavaScript - это структура данных для хранения пар ключ-значение. Но в отличие от простой карты или словаря, объекты JavaScript легко настраиваются. В этом уроке мы узнаем о «дескрипторе свойства», который содержит конфигурации свойства объекта.

Когда мы создаем объект JavaScript, используя литеральный синтаксис объекта или какие-либо другие средства, и добавляем к нему некоторые свойства, каждое свойство (key) получает дескриптор свойства по умолчанию . Дескриптор свойства - это простой объект JavaScript, связанный с каждым свойством объекта, который содержит информацию об этом свойстве, такую ​​как его value и другие метаданные.

В приведенном выше примере мы создали простой объект JavaScript myObj, используя буквальный синтаксис со свойствами myPropOne и myPropTwo. Мы задали этим свойствам некоторые начальные значения, а именно. 1 и 2 соответственно.

Теперь, если мы напишем новое значение в свойство myPropOne, как показано ниже, операция будет успешной, и мы получим измененное значение.

Чтобы получить доступ к дескриптору свойства свойства, нам нужно использовать статический метод, предоставляемый Object.. Метод Object.getOwnPropertyDescriptor возвращает дескриптор свойства prop, который является именем свойства объекта obj.

Object.getOwnPropertyDescriptor(obj, prop);

Собственный здесь означает возврат дескриптора свойства prop, только если это свойство принадлежит объекту obj, а не его цепочке прототипов. Если свойство prop не существует на obj, возвращается undefined.

💡 Если вы хотите узнать, что такое прототип или цепочка прототипов, прочтите мой урок о наследовании на основе прототипов в JavaScript.

Метод Object.getOwnPropertyDescriptor возвращает объект с ключами, описывающими настройку и текущее значение свойства. Свойство value дескриптора свойства - это текущее значение свойства, writable - это то, может ли пользователь присвоить этому свойству новое значение, enumerable - будет ли это свойство отображаться в перечислениях, таких как for in цикл, for of цикл или Object.keys и т. Д.

Свойство configurable сообщает, есть ли у пользователя разрешение на изменение дескриптора свойства, например, на изменение значения параметров writable и enumerable.

💡 Дескриптор свойства также имеет ключи get и set, которые являются функциями промежуточного программного обеспечения для возврата значения или обновления значения, но это необязательно.

Чтобы создать новое свойство объекта или обновить существующее свойство с помощью настраиваемого дескриптора, мы используем Object.defineProperty. Давайте изменим существующее свойство myPropOne, установив для writable значение false, что должно запрещать запись в myObj.myPropOne.

Как видно из приведенной выше ошибки, наше свойство myPropOne не доступно для записи, поэтому, если пользователь пытается присвоить ему новое значение, он выдаст ошибку.

💡 Если Object.defineProperty обновляет существующий дескриптор свойства, то исходный дескриптор будет объединен с новыми модификациями. Object.defineProperty возвращает исходный объект myObj после изменений.

Посмотрим, что произойдет, если мы установим для ключа дескриптора enumerable значение false.

Как видно из приведенного выше результата, мы не видим свойство myPropOne объекта в Object.keys перечислении.

Когда вы определяете новое свойство объекта с помощью Object.defineProperty и передаете пустой дескриптор {}, дескриптор по умолчанию выглядит так, как показано ниже.

{
    value: undefined,
    writable: true,
    enumerable: false,
    configurable: false
}

Теперь давайте определим новое свойство с настраиваемым дескриптором, где для ключа дескриптора configurable установлено значение false. Мы сохраним writable до false и enumerable до true с value, установленным на 3.

Установив для ключа дескриптора configurable значение false, мы потеряли возможность изменять дескриптор нашего свойства myPropThree. Это очень полезно, если вы не хотите, чтобы ваши пользователи манипулировали рекомендуемым поведением объекта.

get (getter) и set (setter) для свойства также могут быть установлены в дескрипторе свойства с этими точными ключи. Но когда вы определяете геттер, это приносит некоторые жертвы. У вас вообще не может быть начального значения или value ключа в дескрипторе, потому что геттер вернет значение этого свойства. Вы также не можете использовать ключ writable в дескрипторе, потому что ваши записи выполняются через сеттер, и вы можете предотвратить запись там. Ознакомьтесь с документацией MDN для получателя и установщика.

💡 Вы можете создавать и / или обновлять несколько свойств одновременно, используя Object.defineProperties, который принимает два аргумента. Первый аргумент - это целевой объект, свойства которого должны быть добавлены / изменены, а второй аргумент - это объект с key в качестве имени свойства и value в качестве его дескриптора свойства. Эта функция возвращает целевой объект.

Вы пробовали использовать Object.create функцию для создания объектов? Это самый простой способ создать объект без прототипа или без него. Это также один из самых простых способов создания объектов с нуля с помощью настраиваемых дескрипторов свойств.

Object.create имеет следующий синтаксис.

var obj = Object.create( prototype, { property: descriptor, ... } )

Здесь prototype - объект, который будет прототипом obj. Если prototype равно null, то у obj не будет прототипа. Когда вы определяете пустой или непустой объект с синтаксисом var obj= {}, по умолчанию obj.__proto__ указывает на Object.prototype, следовательно, obj имеет прототип класса Object.

Это похоже на использование Object.create с Object.prototype в качестве первого аргумента (прототип создаваемого объекта).

Но когда мы устанавливаем прототип на null, мы получаем ошибку ниже.