← Назад к вопросам

Как создать объект без прототипа?

2.3 Middle🔥 111 комментариев
#JavaScript Core

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI26 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Создание объекта без прототипа в JavaScript

Обычно все объекты в JavaScript наследуют прототип — это основа прототипной модели наследования. Однако есть специальные способы создать объект, полностью лишённый прототипа.

Основной способ: Object.create(null)

Самый простой и надёжный способ — использовать Object.create(null):

const obj = Object.create(null);
console.log(Object.getPrototypeOf(obj)); // null
console.log(obj.toString); // undefined — нет методов из Object.prototype

Этот объект полностью пустой и не имеет никаких методов, которые обычно наследуются от Object.prototype.

Почему нужны объекты без прототипа?

1. Безопасность: защита от污染 прототипа (Prototype Pollution)

Объект без прототипа защищён от вредоносного кода, который может попытаться изменить Object.prototype:

// Вредоносный код
Object.prototype.isAdmin = true;

// Обычный объект — заражен
const user1 = {};
console.log(user1.isAdmin); // true — опасно!

// Объект без прототипа — защищён
const user2 = Object.create(null);
console.log(user2.isAdmin); // undefined — безопасно

2. Словари и map'ы данных

Объекты без прототипа идеальны для хранения пользовательских данных, где не нужны встроенные методы:

const cache = Object.create(null);
cache['key1'] = 'value1';
cache['key2'] = 'value2';

// Нет конфликтов с встроенными свойствами
console.log(cache.hasOwnProperty); // undefined

3. Избежание проверок hasOwnProperty

const config = Object.create(null);
config.debug = true;
config.timeout = 5000;

// Можно безопасно проверять свойства без hasOwnProperty
for (const key in config) {
  console.log(key); // только реальные свойства, нет наследованных
}

Практические примеры

Создание словаря без встроенных методов:

const userMap = Object.create(null);
userMap['1'] = { name: 'Иван', age: 30 };
userMap['2'] = { name: 'Мария', age: 25 };

console.log(userMap.constructor); // undefined — нет встроенных методов
console.log(Object.keys(userMap)); // ['1', '2']

JSON парсинг с защитой:

const json = '{"name": "Пётр", "age": 35}';
const data = Object.create(null);
Object.assign(data, JSON.parse(json));

// Безопасно работаем с данными
console.log(data.name); // Пётр
console.log(data.constructor); // undefined

Создание свойств без конфликтов:

const obj = Object.create(null);
obj.toString = 'custom value'; // можно присваивать встроенные имена
obj.hasOwnProperty = 'custom'; // конфликтов не будет

console.log(obj.toString); // custom value
console.log(typeof obj.hasOwnProperty); // string

Важные особенности

  • Нет методов: toString(), hasOwnProperty(), constructor недоступны
  • instanceof не работает: объект без прототипа всегда вернёт false
  • Object.keys() работает: вернёт только собственные свойства
  • Отсутствие прототипной цепи: нет наследования

Когда использовать

✓ Для хранения пользовательских данных ✓ Для реализации словарей и кэшей ✓ Для защиты от prototype pollution ✓ Когда нужна максимальная безопасность и предсказуемость

✗ Когда нужны встроенные методы объекта ✗ Когда код ожидает стандартный объект

Объекты без прототипа — это мощный инструмент для безопасного хранения данных и защиты от атак на прототип.