JavaScript: Object.create, Getters и Setters

Создание объектов с Object.create

Метод Object.create() создаёт объекты. Он принимает два параметра:

  1. Прототип: Объект, который станет прототипом создаваемого объекта. В этом примере он не используется (равен null).
  2. Описание полей: Объект, определяющий поля создаваемого объекта и их свойства (property descriptors). Ключи — имена полей, значения — их описания.

Пример создания объекта person:

const person = Object.create(null, {
  name: { value: 'Владилен', writable: true, enumerable: false },
  birthYear: { value: 1993, writable: true, enumerable: false }
});

console.log(person);

enumerable: false предотвращает отображение поля при итерации с помощью for…in. По умолчанию, enumerable — false.

Итерация по person с помощью for…in не покажет name и birthYear, так как enumerable для них — false:

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

Чтобы включить поля в итерацию for…in, установите enumerable: true:

const person = Object.create(null, {
  name: { value: 'Владилен', writable: true, enumerable: true },
  birthYear: { value: 1993, writable: true, enumerable: true }
});

Property Descriptors

Object.create() позволяет управлять свойствами полей через property descriptors:

  • writable: Разрешает изменение значения поля. По умолчанию — false.
  • enumerable: Определяет, будет ли поле перечисляться в циклах for…in. По умолчанию — false.
  • configurable: Разрешает удаление поля или изменение его атрибутов. По умолчанию — false.

Пример использования writable и configurable:

const person = Object.create(null, {
  name: { value: 'Максим', writable: true, configurable: true },
  birthYear: { value: 1993, writable: false, configurable: false }
});

person.name = 'Василий'; //  Изменение возможно, так как writable: true
person.birthYear = 2000; // Изменение невозможно, так как writable: false

delete person.name; // Удаление возможно, так как configurable: true
delete person.birthYear; // Удаление невозможно, так как configurable: false

Getters и Setters

Getters и setters — методы доступа к свойствам объекта, позволяющие выполнять действия при получении или изменении значения. Они объявляются с помощью get и set в описании полей.

Пример использования getters и setters для вычисления возраста:

const person = Object.create(null, {
  birthYear: { value: 1993, writable: true, enumerable: true },
  age: {
    get: function() { return new Date().getFullYear() - this.birthYear; },
    set: function(newAge) {
      console.log('Set age:', newAge);
      // Дополнительная логика при изменении возраста
    }
  }
});

console.log(person.age); // Текущий возраст
person.age = 100; // Выведет в консоль 'Set age: 100', но birthYear не изменится

getter для age вычисляет возраст, а setter выводит сообщение при изменении age.

Проверка собственных свойств объекта

Для итерации только по собственным свойствам объекта, без свойств прототипа, используйте hasOwnProperty():

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

Object.create, property descriptors, getters и setters — мощный инструмент для управления объектами в JavaScript, позволяющий создавать гибкий и динамический код. Они являются основой многих фреймворков и библиотек JavaScript.

Что будем искать? Например,программа