Тип Дескриптор свойства (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