Skip to main content

Що робить Object.create()?

Object.create() - це один із базових методів для роботи з прототипами в JavaScript. Він дозволяє створити новий об'єкт, указуючи вручну його прототип (те, від чого він успадковується).


Коротко

Синтаксис:

javascript
Object.create(proto, [propertiesObject])
ПараметрОпис
protoОб'єкт, який стане прототипом нового об'єкта (або null)
propertiesObject (необов'язково)Додаткові властивості для нового об'єкта (у форматі дескрипторів)

Приклад 1 - базове використання

javascript
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 - перевіримо прототип

javascript
console.log(Object.getPrototypeOf(tim) === user); // true

Object.create() буквально створює новий об'єкт, чий __proto__ дорівнює user.


Приклад 3 - об'єкт без прототипу

javascript
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():

javascript
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 - "успадкування" вручну

javascript
const Animal = { eat() { console.log('Я їм'); } }; const Dog = Object.create(Animal); Dog.bark = function() { console.log('Гав!'); }; Dog.eat(); // "Я їм" - успадковано від Animal Dog.bark(); // "Гав!" - власне

Чудовий спосіб реалізувати просте прототипне успадкування без класів і конструкторів.


Приклад 6 - альтернатива class

javascript
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

Коротка відповідь

Для співбесіди
Premium

Коротка відповідь допоможе вам впевнено відповідати на цю тему під час співбесіди.