April 11th, 2021

Учебник по JavaScript: ч.1: свойства объекта, их конфигурация

Прочел седьмой раздел («Свойства объекта, их конфигурация») первой части («Язык программирования JavaScript») учебника по JavaScript.

https://learn.javascript.ru

Часть 1. Язык программирования JavaScript (в т.ч. 93 подраздела)

Разделы:

7. Свойства объекта, их конфигурация (2 подраздела)

7.1 Флаги и дескрипторы свойств
7.2 Свойства - геттеры и сеттеры

У каждого из свойств объекта кроме ключа (идентификатора свойства, по-английски «key») и значения (по-английски «value») еще есть три флага, которые могут принимать значения true или false. Эти флаги называются writable (по-русски «доступное для записи»), enumerable (по-русски «видимое при перечислениях», например, в цикле for..in) и configurable (по-русски «доступное для переконфигурирования»).

Когда мы создаем свойство объекта «обычным способом», эти три флага по умолчанию устанавливаются в значение true, то есть свойство объекта по умолчанию является доступным для записи, видимым при перечислениях и доступным для переконфигурирования (под «переконфигурированием» подразумевается изменение значений флагов).

Для настройки значений флагов при создании свойства объекта или перенастройки значений флагов после создания свойства объекта или получения текущих значений флагов свойства объекта в языке JavaScript существуют специальные функции (методы). Вот два, возможно, самые популярные из них:

Object.defineProperty
Object.getOwnPropertyDescriptor

Эти методы оперируют так называемыми дескрипторами (по-английски «descriptor») свойств объектов (эту кальку с английского на русский язык можно перевести словом «описатель», то есть дескриптор описывает конфигурацию свойства объекта). Пример дескриптора:

{
    value: "Иван",
    writable: false,
    enumerable: false,
    configurable: false
}

Пример создания нового свойства name объекта user с использованием дескриптора:
let user = { };

Object.defineProperty(user, "name", {
    value: "Иван",
    writable: false,
    enumerable: true,
    configurable: true
});
Если при определении нового свойства объекта таким образом какой-то флаг в дескрипторе не указать, значением этого флага по умолчанию будет являться false.

В подразделе 7.2 учебника рассказано, что свойства объекта делятся на свойства-данные (по-английски «data properties»), которые обсуждались в учебнике ранее, и свойства-аксессоры (по-английски «accessor properties», что по-русски может быть переведено как «свойства доступа» или «свойства средств доступа»), о которых рассказывается в этом подразделе.

Кальку «аксессор» на русский язык можно перевести как «средство доступа». Свойства-аксессоры можно использовать вне объекта так же, как и свойства-данные. Однако, на самом деле свойств-аксессоров внутри объекта не существует, вместо них должны быть прописаны специальные методы с ключевыми словами get и set, отдельные для каждого свойства-аксессора. Эти методы называют геттером и сеттером, что по-русски означает «получатель» и «установщик» (имеется в виду получение (чтение) значения свойства-аксессора и установка (присвоение, запись, перезапись) значения свойства-аксессора). На самом деле геттеры и сеттеры обычно получают значения из обычных свойств-данных и записывают значения в те же обычные свойства-данные.

Вот как это работает:
let user = {
    name: "John",                                     // свойство-данные
    surname: "Smith",                                 // свойство-данные

    get fullName() {                                  // геттер свойства-аксессора fullName
        return `${this.name} ${this.surname}`;
    },

    set fullName(value) {                             // сеттер свойства-аксессора fullName
        [this.name, this.surname] = value.split(" ");
    }
};
Снаружи объекта доступ к свойству-аксессору user.fullName синтаксически ничем не отличается от доступа к свойствам-данным user.name и user.surname.