> Куда записывается свойство при добавлении его в прототип объекта в 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-коде, так как может привести к конфликтам. В современных проектах предпочитают классы и статические методы.
Пример кода
JAVASCRIPTfunction 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')); // falseconsole.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__ - Непонимание, что запись через экземпляр не изменяет прототип
- Ошибочное мнение, что изменение прототипа после создания экземпляров не влияет на них
- Игнорирование исключения с сеттерами в прототипе
> Похожие задачи по frontend
Как обрабатывать дублирующиеся ключи при преобразовании массива объектов в объект в JavaScript
Как отфильтровать строку, чтобы оставить только буквы с помощью регулярных выражений в JavaScript
Каковы причины утечек памяти в JavaScript
Зачем нужен event loop?
> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?
Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью