Объекты 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
, мы получаем ошибку ниже.