Создание объектов с Object.create
Метод Object.create() создаёт объекты. Он принимает два параметра:
- Прототип: Объект, который станет прототипом создаваемого объекта. В этом примере он не используется (равен null).
- Описание полей: Объект, определяющий поля создаваемого объекта и их свойства (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.