Skip to main content

Чистий об'єкт без prototype

У 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);
  • він не наслідує нічого, і ідеально підходить для безпечних словників.

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

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

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