Вопрос проверяет понимание механизма прототипов в JavaScript, который является основой для реализации наследования и повторного использования кода.
В JavaScript функции являются объектами первого класса, и у них есть специальное свойство prototype. Это свойство существует только у функций (за исключением стрелочных) и автоматически создаётся движком при объявлении функции. Оно играет ключевую роль в механизме прототипного наследования.
Свойство prototype — это обычный объект, который изначально имеет одно собственное свойство constructor, ссылающееся обратно на саму функцию. Этот объект используется как шаблон или "хранилище общих методов" для всех объектов, которые будут созданы с помощью данной функции в роли конструктора.
Когда вы создаёте объект через new Constructor(), внутренняя ссылка [[Prototype]] (доступная через __proto__ или Object.getPrototypeOf()) этого нового объекта устанавливается на объект Constructor.prototype. Таким образом, если свойство не найдено в самом объекте, JavaScript ищет его в цепочке прототипов, начиная с Constructor.prototype.
// Объявляем функцию-конструктор
function Person(name) {
this.name = name;
}
// Добавляем метод в прототип функции Person
Person.prototype.greet = function() {
console.log(`Привет, меня зовут ${this.name}`);
};
// Создаём экземпляр
const alice = new Person('Алиса');
// Метод вызывается из прототипа
alice.greet(); // Вывод: Привет, меня зовут Алиса
// Проверяем связь
console.log(Object.getPrototypeOf(alice) === Person.prototype); // true
console.log(alice.constructor === Person); // true (через цепочку прототипов)Array.prototype, что требует осторожности).Вывод: Свойство prototype функции — это объект, который становится прототипом для всех экземпляров, созданных через new. Этот механизм стоит использовать, когда нужно эффективно разделять методы между множеством объектов одного типа, избегая дублирования кода.