> Куда записывается свойство при добавлении его в прототип объекта в JavaScript (JavaScript)

Уровень: middle · Роль: frontend · Категория: Технические вопросы

Компании: IT-One

Стек: JavaScript

> Пример ответа

Короткий ответ

Свойство записывается непосредственно в объект-прототип, а не в экземпляр. При добавлении свойства через MyPrototype.newProp = value оно становится доступным всем объектам, у которых MyPrototype находится в цепочке прототипов. При чтении свойства движок проходит по цепочке прототипов, но при записи - всегда создает собственное свойство на объекте, не изменяя прототип.

Подробное объяснение

В JavaScript каждый объект имеет внутреннюю ссылку [[Prototype]] (доступную через __proto__ или Object.getPrototypeOf). Когда вы добавляете свойство в прототип, оно попадает именно туда - в объект, который служит прототипом для других объектов.

Важно понимать разницу между чтением и записью:

  • Чтение: если свойство не найдено в собственном объекте, движок поднимается по цепочке прототипов до тех пор, пока не найдет свойство или не дойдет до null.
  • Запись: всегда создает или изменяет собственное свойство объекта, никогда не трогает прототип. Исключение - сеттеры, определенные в прототипе.

При добавлении свойства через Constructor.prototype.prop = value оно становится доступным всем экземплярам, созданным через new Constructor(), а также тем, у кого этот прототип установлен через Object.create().

На практике

Добавление свойств в прототип - ключевой механизм для:

  • Экономии памяти: методы, общие для всех экземпляров, хранятся в одном месте
  • Динамического наследования: изменения в прототипе мгновенно отражаются на всех существующих объектах
  • Полифиллов: добавление методов в нативные прототипы (например, Array.prototype.includes)

Однако прямое изменение прототипов встроенных объектов считается плохой практикой в production-коде, так как может привести к конфликтам. В современных проектах предпочитают классы и статические методы.

Пример кода

JAVASCRIPT
function Animal(name) {
this.name = name;
}
// Добавляем метод в прототип
Animal.prototype.sayHello = function() {
console.log(`Привет, я ${this.name}`);
};
const dog = new Animal('Шарик');
const cat = new Animal('Мурка');
dog.sayHello(); // "Привет, я Шарик"
cat.sayHello(); // "Привет, я Мурка"
// Проверяем, что метод не собственный
console.log(dog.hasOwnProperty('sayHello')); // false
console.log(Animal.prototype.hasOwnProperty('sayHello')); // true
// Добавляем свойство в прототип после создания экземпляров
Animal.prototype.type = 'животное';
console.log(dog.type); // "животное" - доступно всем
// Запись в экземпляр не затрагивает прототип
dog.type = 'собака';
console.log(dog.type); // "собака" - собственное свойство
console.log(cat.type); // "животное" - из прототипа

Как отвечать на собеседовании

Начните с четкого определения: свойство записывается в объект-прототип. Объясните механизм цепочки прототипов и разницу между чтением и записью. Приведите пример с конструктором или классом. Упомяните, что при записи через экземпляр создается собственное свойство, которое перекрывает прототипное. Если спросят про Object.create - покажите, как работает наследование через прототипы.

Что проверяет интервьюер

  • Понимание прототипного наследования и цепочки прототипов
  • Различие между собственными и унаследованными свойствами
  • Знание механизма записи (set) в контексте прототипов
  • Понимание разницы между prototype (у функций-конструкторов) и [[Prototype]] (у объектов)

Типичные ошибки

  • Утверждение, что свойство записывается в экземпляр при добавлении в прототип
  • Путаница между prototype и __proto__
  • Непонимание, что запись через экземпляр не изменяет прототип
  • Ошибочное мнение, что изменение прототипа после создания экземпляров не влияет на них
  • Игнорирование исключения с сеттерами в прототипе

> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?

Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью