JavaScript | Как получить атрибуты свойства объекта?

JavaScript | Как получить атрибуты свойства объекта?

Массивы — это тоже объекты JavaScript. Если смотреть на массивы под таким углом, то каждое свойство объекта имеет свой набор атрибутов.

Каждое свойство является либо «свойством данных» (data property), либо «свойством доступа» (accessor property):

  • Свойство данных (data property) связывает значение ключа со значением языка ECMAScript и набором логических атрибутов Boolean.
  • Свойство доступа (accessor property) связывает значение ключа с одной или двумя функциями средства доступа и набором логических атрибутов Boolean. Функции доступа используются для хранения или получения значения языка ECMAScript, связанного со свойством.

 

Свойство данных (data property) связывает значение ключа с атрибутами, перечисленными в таблице 3.

Имя атрибута Область значений Описание
[[Value]] Любой тип из языка ECMAScript Значение, полученное при доступе к свойству.
[[Writable]] Boolean Если false, попытки кода ECMAScript изменить атрибут свойства [[Value]] с помощью [[Set]] не увенчаются успехом.
[[Enumerable]] Boolean Если true, свойство будет нумероваться путем перечисления для входа (см. 13.7.5). В противном случае свойство называется неперечислимым (non-enumerable).
[[Configurable]] Boolean Если false, попытки удалить свойство, изменить свойство на свойство доступа или изменить его атрибуты (кроме [[Value]] или изменение [[Writable]] на false) завершатся ошибкой.

Таблица 3: Атрибуты свойства данных — Table 3: Attributes of a Data Property

 

Пример

Например у нас есть массив из чисел,

var massiv = [11, 22, 33, 44]

Мы можем получить собственные свойства объекта. Для этого мы обращаемся к конструктору Object и у него вызываем метод getOwnPropertyDescriptors(). Внутрь метода мы передаём один параметр — наш массив.

Object.getOwnPropertyDescriptors(massiv)
Получили собственные свойства массива - JavaScript
Получили собственные свойства массива — JavaScript

 

После этого нам возвращается объект с атрибутами свойств.

{0: {…}, 1: {…}, 2: {…}, 3: {…}, length: {…}}
0: {value: 11, writable: true, enumerable: true, configurable: true}
1: {value: 22, writable: true, enumerable: true, configurable: true}
2: {value: 33, writable: true, enumerable: true, configurable: true}
3: {value: 44, writable: true, enumerable: true, configurable: true}
length: {value: 4, writable: true, enumerable: false, configurable: false}
__proto__: Object

Мы видим, что каждый атрибут свойства объекта имеет значение true. Это значит, что мы можем:

  • перезаписывать значение свойства
  • обходить свойства в циклах
  • удалять свойства

 

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

JavaScript | Объекты (Object)

Стандарт ECMAScript — Раздел «20.1.2.9 Object.getOwnPropertyDescriptors ( O )» — https://tc39.es/ecma262/#sec-object.getownpropertydescriptors