логотип PurpleSchool
Иконка входа
Вход
  • Обучение
  • Войти
логотип PurpleSchool

Дескрипторы в JavaScript

Автор

Дмитрий Нечаев

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

Дескрипторы данных

Дескрипторы данных предоставляют информацию о значениях свойств, их возможности записи, перечисляемости и конфигурируемости. Основные атрибуты дескриптора данных:

  • value – значение свойства.
  • writable – если true, значение свойства можно изменить с помощью оператора присваивания.
  • enumerable – если true, свойство будет перечислено в циклах (например, for...in).
  • configurable – если true, свойство можно удалять, и его дескриптор можно изменять.

Пример создания свойства с дескриптором данных:

let obj = {};

Object.defineProperty(obj, 'number', {
  value: 123,
  writable: false,
  enumerable: true,
  configurable: false
});

console.log(obj.number); // 123
obj.number = 456;
console.log(obj.number); // 123, значение не изменится, так как writable: false

Дескрипторы доступа

Дескрипторы доступа не содержат прямого значения свойства, а предоставляют функции-геттеры и сеттеры для управления свойством. Атрибуты дескриптора доступа:

  • get – функция, которая вызывается, когда свойство читается.
  • set – функция, которая вызывается, когда свойству присваивается значение.
  • enumerable – аналогично дескриптору данных.
  • configurable – аналогично дескриптору данных.

Пример дескриптора доступа:

let user = {
  firstName: "Алексей",
  lastName: "Иванов"
};

Object.defineProperty(user, 'fullName', {
  get() {
    return `${this.firstName} ${this.lastName}`;
  },
  set(value) {
    [this.firstName, this.lastName] = value.split(" ");
  },
  enumerable: true,
  configurable: true
});

console.log(user.fullName); // Алексей Иванов
user.fullName = "Мария Петрова";
console.log(user.firstName); // Мария
console.log(user.lastName); // Петрова

Методы для работы с дескрипторами

  • Object.defineProperty(obj, propName, descriptor): определяет новое свойство или изменяет существующее на объекте, и возвращает этот объект.
  • Object.defineProperties(obj, props): определяет множество свойств с использованием дескрипторов.
  • Object.getOwnPropertyDescriptor(obj, propName): возвращает дескриптор для свойства объекта.

Пример использования Object.defineProperties:

Object.defineProperties(user, {
  birthYear: {
    value: 1990,
    writable: false
  },
  age: {
    get() {
      let yearNow = new Date().getFullYear();
      return yearNow - this.birthYear;
    },
    enumerable: true
  }
});

console.log(user.age); // вычисляет возраст на основе birthYear

Заключение

Дескрипторы свойств в JavaScript — это мощный инструмент для более глубокого контроля над свойствами объектов. Они позволяют точно настраивать, как свойства должны вести себя при чтении, записи, перечислении и конфигурации. Это особенно полезно в разработке библиотек, API и в ситуациях, когда требуется строгий контроль над данными.

Карта развития разработчика

Получите полную карту развития разработчика по всем направлениям: frontend, backend, devops, mobile