Що робить Object.create()?
Object.create() - це один із базових методів для роботи з прототипами в JavaScript.
Він дозволяє створити новий об'єкт, указуючи вручну його прототип (те, від чого він успадковується).
Коротко
Синтаксис:
Object.create(proto, [propertiesObject])| Параметр | Опис |
|---|---|
proto | Об'єкт, який стане прототипом нового об'єкта (або null) |
propertiesObject (необов'язково) | Додаткові властивості для нового об'єкта (у форматі дескрипторів) |
Приклад 1 - базове використання
const user = {
sayHi() {
console.log(`Привіт, ${this.name}!`);
}
};
const tim = Object.create(user); // створюємо об'єкт, що успадковує від user
tim.name = 'Tim';
tim.sayHi(); // "Привіт, Tim!"Тут:
user- це прототип ([[Prototype]]) дляtim;timне має власного методуsayHi, але він успадковується через прототип.
Приклад 2 - перевіримо прототип
console.log(Object.getPrototypeOf(tim) === user); // trueObject.create() буквально створює новий об'єкт, чий __proto__ дорівнює user.
Приклад 3 - об'єкт без прототипу
const data = Object.create(null);
data.a = 1;
console.log(data); // { a: 1 }
console.log(Object.getPrototypeOf(data)); // null
console.log(data.toString); // undefinedТакий об'єкт нічого не успадковує, навіть toString, hasOwnProperty тощо.
Використовується для чистих словників (map-об'єктів) без конфліктів за іменами.
Приклад 4 - з propertiesObject (другий аргумент)
Можна одразу задати властивості з налаштуваннями, як у Object.defineProperty():
const person = Object.create({}, {
name: { value: 'Tim', writable: false, enumerable: true },
age: { value: 25, writable: true }
});
console.log(person.name); // "Tim"
person.name = 'Oleh'; // не зміниться
console.log(person.name); // "Tim"Другий параметр дозволяє детально описувати атрибути властивостей
(value, writable, enumerable, configurable).
Приклад 5 - "успадкування" вручну
const Animal = {
eat() {
console.log('Я їм');
}
};
const Dog = Object.create(Animal);
Dog.bark = function() {
console.log('Гав!');
};
Dog.eat(); // "Я їм" - успадковано від Animal
Dog.bark(); // "Гав!" - власнеЧудовий спосіб реалізувати просте прототипне успадкування без класів і конструкторів.
Приклад 6 - альтернатива class
const UserProto = {
init(name) {
this.name = name;
return this;
},
greet() {
console.log(`Привіт, ${this.name}`);
}
};
const user = Object.create(UserProto).init('Tim');
user.greet(); // "Привіт, Tim"Такий підхід часто застосовують у функціональному ООП-стилі - без класів, але з успадкуванням через прототип.
Підсумок
| Що робить | Приклад | Результат |
|---|---|---|
| Створює об'єкт із указаним прототипом | Object.create(proto) | Новий об'єкт, у якого [[Prototype]] = proto |
| Створює об'єкт без прототипу | Object.create(null) | "Чистий" об'єкт без toString, hasOwnProperty |
| Можна задати властивості з атрибутами | Object.create({}, { key: { value: 1 } }) | Аналог defineProperty() |
| Використовується для успадкування | const child = Object.create(parent) | child успадковує властивості parent |
Коротка відповідь
Для співбесідиКоротка відповідь допоможе вам впевнено відповідати на цю тему під час співбесіди.