ECMAScript | Дескриптор свойства | Тип спецификации

ECMAScript | Дескриптор свойства | Тип спецификации

Тип Дескриптор свойства (Property Descriptor type) используется для объяснения манипуляции и повторения атрибутов свойств Объекта. Значения типа Дескриптора Свойства — это Записи. Имя каждого поля — это имя атрибута, а его значение — соответствующее значение атрибута, как указано в пункте 6.1.7.1. Кроме того, любое поле может присутствовать или отсутствовать. Имя схемы, используемое в этой спецификации для маркировки буквальных описаний записей дескриптора свойства является «PropertyDescriptor».

 

 

Значения Дескрипторов Свойств могут быть дополнительно классифицированы как «дескрипторы свойств данных» (data Property Descriptors) и «дескрипторы свойств средств доступа» (accessor Property Descriptors) в зависимости от наличия или использования определенных полей.

Дескриптор свойства данных — это тот, который включает любые поля с именами [[Value]] или [[Writable]].

Дескриптор свойства средства доступа — это тот, который включает любые поля с именами [[Get]] или [[Set]].

Любой Дескриптор Свойства может иметь поля с именами [[Enumerable]] и [[Configurable]]. Значение дескриптора свойства не может быть одновременно дескриптором свойства данных и дескриптором свойства средства доступа; однако это может быть ни то, ни другое.

Универсальный Дескриптор свойства — это значение дескриптора свойства, которое не является ни дескриптором свойства данных, ни дескриптором свойства средства доступа.

Полностью заполненный дескриптор свойства — это дескриптор свойства средства доступа или дескриптор свойства данных, который имеет все поля, соответствующие атрибутам свойств, определенным в таблице 3 или таблице 4.

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

6.2.5.1 IsAccessorDescriptor ( Desc )
6.2.5.2 IsDataDescriptor ( Desc )
6.2.5.3 IsGenericDescriptor ( Desc )
6.2.5.4 FromPropertyDescriptor ( Desc )
6.2.5.5 ToPropertyDescriptor ( Obj )
6.2.5.6 CompletePropertyDescriptor ( Desc )

 

 

6.2.5.1 IsAccessorDescriptor ( Desc )

Абстрактная операция IsAccessorDescriptor принимает аргумент Desc (Дескриптор Свойства или undefined). При вызове она выполняет следующие шаги:

1. Если Desc является undefined (не определен), вернуть false.
2. Если оба Desc.[[Get]] и Desc.[[Set]] отсутствуют, вернуть false.
3. Вернуть true.

 

6.2.5.2 IsDataDescriptor ( Desc )

Абстрактная операция IsDataDescriptor принимает аргумент Desc (Дескриптор Свойства или undefined). При вызове она выполняет следующие шаги:

1. Если Desc является undefined (не определен), вернуть false.
2. Если оба Desc.[[Value]] и Desc.[[Writable]] отсутствуют, вернуть false.
3. Вернуть true.

 

6.2.5.3 IsGenericDescriptor ( Desc )

Абстрактная операция IsGenericDescriptor принимает аргумент Desc (Дескриптор Свойства или undefined). При вызове она выполняет следующие шаги:

1. Если Desc является undefined (не определен), вернуть false.
2. Если IsAccessorDescriptor(Desc) и IsDataDescriptor(Desc) оба являются false (ложны), верните true.
3. Вернуть false.

 

6.2.5.4 FromPropertyDescriptor ( Desc )

Абстрактная операция FromPropertyDescriptor принимает аргумент Desc (Дескриптор Свойства или undefined). При вызове она выполняет следующие шаги:

1. Если Desc является undefined (не определен), вернуть undefined.
2. Пусть  obj будет ! OrdinaryObjectCreate(%Object.prototype%).
3. Утверждено: obj - это расширяемый обычный объект без собственных свойств.
4. Если Desc имеет поле [[Value]], тогда
  а. Выполнять ! CreateDataPropertyOrThrow(obj, "value", Desc.[[Value]]).
5. Если Desc имеет поле [[Writable]], тогда
  а. Выполнять ! CreateDataPropertyOrThrow(obj, "writable", Desc.[[Writable]]).
6. Если Desc имеет поле [[Get]], тогда
  а. Выполнять ! CreateDataPropertyOrThrow(obj, "get", Desc.[[Get]]).
7. Если Desc имеет поле [[Set]], тогда
  а. Выполнять ! CreateDataPropertyOrThrow(obj, "get", Desc.[[Set]]).
8. Если Desc имеет поле [[Enumerable]], тогда
  а. Выполнять ! CreateDataPropertyOrThrow(obj, "enumerable", Desc.[[Enumerable]]).
9. Если Desc имеет поле [[Configurable]], тогда
  а. Выполнять ! CreateDataPropertyOrThrow(obj, "configurable", Desc.[[Configurable]]).
10. Вернуть obj.

 

6.2.5.5 ToPropertyDescriptor ( Obj )

Абстрактная операция ToPropertyDescriptor принимает аргумент Obj. При вызове она выполняет следующие шаги:

1. Если Тип(Obj) не является Объектом, выбросить исключение TypeError.
2. Пусть desc будет новым Дескриптором Свойства, который изначально не имеет полей.
3. Пусть hasEnumerable будет ? HasProperty(Obj, "enumerable").
4. Если hasEnumerable является true (истинно), то
  а. Пусть enumerable будет ! ToBoolean(? Get(Obj, "enumerable")).
  b. Установите для desc.[[Enumerable]] значение enumerable.
5. Пусть hasConfigurable будет ? HasProperty(Obj, "configurable").
6. Если hasConfigurable является true (истинно), то
  а. Пусть configurable будет ! ToBoolean(? Get(Obj, "configurable")).
  b. Установите для desc.[[Configurable]] значение configurable.
7. Пусть hasValue будет ? HasProperty(Obj, "value").
8. Если hasValue является true (истинно), то
  а. Пусть value будет ? Получить(Obj, "value").
  b. Установите для desc.[[Value]] значение value.
9. Пусть hasWritable будет? HasProperty(Obj, "writable").
10. Если hasWritable является true (истинно), то
  а. Пусть writable будет ! ToBoolean(? Get(Obj, "writable")).
  b. Установите для desc.[[Writable]] значение writable.
11. Пусть hasGet будет ? HasProperty(Obj, "get").
12. Если hasGet является true (истинно), то
  а. Пусть getter будет ? Get(Obj, "get").
  b. Если IsCallable(getter) имеет значение false и getter не является undefined, генерировать исключение TypeError.
  c. Установить для desc.[[Get]] значение getter.
13. Пусть hasSet будет? HasProperty(Obj, "set").
14. Если hasSet является true (истинно), то
  а. Пусть setter будет ? Get(Obj, "set").
  b. Если IsCallable(setter) имеет значение false и setter не является undefined, генерировать исключение TypeError.
  c. Установите для desc.[[Set]] на setter.
15. Если desc.[[Get]] присутствует или присутствует desc.[[Set]], то
  а. Если присутствует desc.[[Value]] или присутствует desc.[[Writable]], бросить исключение TypeError.
16. Вернуть desc.

 

6.2.5.6 CompletePropertyDescriptor ( Desc )

Абстрактная операция CompletePropertyDescriptor принимает аргумент Desc (Дескриптор Свойства). При вызове она выполняет следующие шаги:

1. Пусть like будет Записью {[[Value]]: undefined, [[Writable]]: false, [[Get]]: undefined, [[Set]]: undefined, [[Enumerable]] ": false, [[Configurable]]: false}.
2. Если IsGenericDescriptor(Desc) является true (истинно) или IsDataDescriptor(Desc) является true (истинно), то
   а. Если Desc не имеет поля [[Value]], установите Desc.[[Value]] на like.[[Value]].
   b. Если Desc не имеет поля [[Writable]], установите Desc.[[Writable]] на like.[[Writable]].
3. Иначе,
   а. Если Desc не имеет поля [[Get]], установите Desc.[[Get]] на like.[[Get]].
   b. Если Desc не имеет поля [[Set]], установите Desc.[[Set]] на like.[[Set]].
4. Если Desc не имеет поля [[Enumerable]], установите Desc.[[Enumerable]] на like.[[Enumerable]].
5. Если Desc не имеет поля [[Configurable]], установите Desc.[[Configurable]] на like.[[Configurable]].
6. Верните Desc.

 

Информационные ссылки

Стандарт ECMAScript — Раздел «6.2.5 The Property Descriptor Specification Type» — https://tc39.es/ecma262/#sec-property-descriptor-specification-type