Дескрипторы свойств (Property descriptors) в Java Script

4

Дескрипторы свойств (property descriptors)

Давайте посмотрим на кое-что интересное. Мы создадим объект а-ля person и укажем ему какое нибудь имя, например Igor.

let person = {name: "Igor"};

Посмотрим на его методы в консоли, и увидим все стандартные методы объектов.

Однако, если мы проитерируемся по ключам объекта, то мы увидим только одно свойство name.

for (let key in person) {
    console.log(key);
}

В том числе если мы попытаемся получить ключи через Object.keys, то мы опять увидим только свойство name

Object.keys(person);

Итак, почему же мы не можем проитерироваться по всем свойствам и методам определённых в базовом объекте?

Причина в том, что в Java Script наши свойства имеют аттрибуты закрепленные за ними. Иногда эти атрибуты не дают свойству быть перечисленным.

Итак, давайте возьмем прототип объекта person — это будет наш базовый объект.

let objectBase = Object.getPrototypeOf(person);

Теперь посмотрим на атрибуты прикрепленные к свойству toString, а точнее к методу toString.
Для этого воспользуемся следующей конструкцией:

let descriptor = Object.getOwnPropertyDescriptor(objectBase, 'toString');

Теперь можно вывести descriptor в консоль и посмотреть подробнее на него. Мы увидим объект дескриптора.

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

Мы увидим что свойство configurable установлено как true. Это значит, что мы можем удалить это свойство если захотим.

Также видим что параметр enumerable установлен как false. Именно поэтому когда мы итерируем наш объект, на не выводится праметр toString.

Также мы видим, что writable установлен как true. Это означает, что мы можем перезаписать этот метод. Можем изменить его имплементацию, можем поменять его значение.

Теперь посмотрим на параметр value, в котором прописан метод. Здесь стандартная имплементация toString метода.

Когда вы создаете свои объекты, то можете установить эти атрибуты для своих свойств.

Давайте посмотрим на пример.
Воспользуемся уже знакомым нам методом Object.defineProperty.
Где первым аргументом передадим наш объект — person, второй аргумент — название нашей желаемой проперти. И третий аргумент — это объект, который и есть дескриптор нашей проперти. То место, где мы добавим атрибуты нашему свойству. Также здесь можем указать getter и setter.

И так начнем заполнять свойство атрибутами. Для начала сделаем свойство только read only — для этого установим параметр writable как false. Теперь мы сделаем свойство неперечисляемым с помощью атрибута enumerable: false. Теперь мы не увидим этой свойство если попробуем проитерировать объект или если получим ключи через Object.keys().

По умолчанию, все свойства дескриптора установлены в положение — true.

Если мы установим configurable как false, то мы не сможем удалить нашу пропертю.

let person = {name: "Igor"};
Object.defineProperty(person, 'name', {
    writable: false,
    enumerable: false
})

You might also like More from author

Leave A Reply

Your email address will not be published.