Запропонувати правкуПокращити цю статтюДопрацюйте відповідь до «Чистий об'єкт без prototype». Ваші зміни проходять модерацію перед публікацією.Потрібне підтвердженняКонтентЩо ви змінюєте🇺🇸EN🇺🇦UAПереглядЗаголовок (UA)Коротка відповідь (UA)У JavaScript **"чистий об'єкт"** (або **object dictionary**) - це об'єкт **без прототипу**, тобто без `Object.prototype` і всіх його вбудованих методів (`toString`, `hasOwnProperty` тощо). **Ключове:** такий об'єкт ідеально підходить для чистих сховищ даних (словники, мапи), де жодні вбудовані властивості не мають перетинатися з твоїми ключами.Показується над повною відповіддю для швидкого нагадування.Відповідь (UA)ЗображенняУ JavaScript **"чистий об'єкт"** (або **object dictionary**) - це об'єкт **без прототипу**, тобто без `Object.prototype` і всіх його вбудованих методів (`toString`, `hasOwnProperty`, і т.д.). Такий об'єкт ідеально підходить для **чистих сховищ даних (словники, мапи)**, де ти хочеш бути впевненим, що **жодні вбудовані властивості не перетнуться з твоїми ключами**. --- ## Як створити чистий об'єкт Найпростіший і правильний спосіб ```javascript const obj = Object.create(null); ``` Це створює **об'єкт без прототипу**, тобто `obj.__proto__ === undefined` і `Object.getPrototypeOf(obj) === null`. --- ## Перевіримо ```javascript const obj = Object.create(null); console.log(Object.getPrototypeOf(obj)); // null console.log('__proto__' in obj); // false console.log(typeof obj.toString); // undefined ``` У такого об'єкта **немає ланцюжка наслідування** - він не наслідує навіть від `Object.prototype`. --- ## Чому це корисно Звичайні об'єкти наслідують купу вбудованих методів: ```javascript const normal = {}; console.log(Object.getPrototypeOf(normal) === Object.prototype); // true // Ці методи доступні console.log(normal.hasOwnProperty); // [Function] console.log(normal.toString); // [Function] ``` Це може бути небезпечно, якщо ключі перетинаються з цими іменами: ```javascript const map = {}; map.toString = 'значення'; // може зламати код, якщо хтось викличе map.toString() ``` "Чистий об'єкт" вирішує цю проблему: ```javascript const map = Object.create(null); map.toString = 'значення'; // просто ключ console.log(map.toString); // "значення" ``` --- ## Приклад використання - "словники" або "мапи" ```javascript const dict = Object.create(null); dict.apple = 1; dict.banana = 2; dict['__proto__'] = 3; // безпечно, не впливає на прототип console.log(dict.apple); // 1 console.log(dict['__proto__']); // 3 ``` У звичайних об'єктах `__proto__` має особливу поведінку, але тут - просто звичайна властивість. --- ## Недолік У "чистого" об'єкта немає вбудованих методів: ```javascript const obj = Object.create(null); obj.name = 'Alice'; console.log(obj.hasOwnProperty('name')); // Помилка: hasOwnProperty is not a function ``` Якщо потрібно перевірити наявність властивості, використовуй безпечний спосіб: ```javascript console.log(Object.prototype.hasOwnProperty.call(obj, 'name')); // true ``` --- ## Альтернатива - використовувати `Map` Сучасний спосіб зберігати словники: ```javascript const map = new Map(); map.set('apple', 1); map.set('__proto__', 2); console.log(map.get('__proto__')); // 2 ``` `Map` вирішує ту саму задачу, але зберігає дані з будь-якими ключами (в тому числі об'єктами). --- ## ПІДСУМОК | Спосіб | Прототип | Доступ до вбудованих методів | Підходить для словників | |---|---|---|---| | `{}` | `Object.prototype` | Є (`toString`, `hasOwnProperty`) | Ні | | `Object.create(null)` | `null` | Немає | Так | | `new Map()` | не об'єкт | Методи `set`, `get`, `has` | Так (сучасний варіант) | --- **В одній фразі:** > Щоб створити "чистий об'єкт" без `Object.prototype`, > використовуй > > ```javascript > const obj = Object.create(null); > ``` > > - він не наслідує нічого, і ідеально підходить для безпечних словників.Для рев’юераПримітка для модератора (необов’язково)Бачить лише модератор. Прискорює рев’ю.