Запропонувати правкуПокращити цю статтюДопрацюйте відповідь до «Що робить Object.create()?». Ваші зміни проходять модерацію перед публікацією.Потрібне підтвердженняКонтентЩо ви змінюєте🇺🇸EN🇺🇦UAПереглядЗаголовок (UA)Коротка відповідь (UA)**`Object.create()`** - один із базових методів для роботи з прототипами в JavaScript, який дозволяє створити новий об'єкт, вручну вказавши його прототип (те, від чого він успадковується). **Ключове:** `Object.create(null)` створює об'єкт без прототипу, що не успадковує навіть `toString` чи `hasOwnProperty`.Показується над повною відповіддю для швидкого нагадування.Відповідь (UA)Зображення`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` |Для рев’юераПримітка для модератора (необов’язково)Бачить лише модератор. Прискорює рев’ю.