Этот вопрос проверяет знание ключевой концепции прототипного наследования в JavaScript.
Прототип — это объект, от которого другой объект может наследовать свойства и методы. В JavaScript каждый объект имеет скрытое свойство [[Prototype]], которое указывает на его прототип. Это позволяет организовать наследование, чтобы не дублировать код и переиспользовать общие методы. Например, если метод не найден в объекте, JavaScript ищет его в прототипе.
Пример:
const animal = { eats: true };
const dog = Object.create(animal);
console.log(dog.eats); // trueВ JavaScript объекты могут наследовать свойства и методы от других объектов. Этот процесс происходит через механизм, называемый прототипным наследованием. Прототип — это объект, связанный с другим объектом через скрытое свойство [[Prototype]] (или __proto__ в старых браузерах).
Когда вы обращаетесь к свойству объекта:
JavaScript сначала ищет его в самом объекте.
Если свойство не найдено, поиск продолжается в его прототипе.
Если свойство есть в прототипе, оно используется.
const animal = {
eats: true,
walk() {
console.log("Гуляет");
}
};
const dog = Object.create(animal); // Создаём объект dog с прототипом animal
dog.barks = true;
console.log(dog.eats); // true (унаследовано от animal)
dog.walk(); // "Гуляет" (метод из прототипа animal)
console.log(dog.barks); // true (собственное свойство dog)Экономия памяти: Общие методы и свойства хранятся в одном объекте (прототипе), а не копируются для каждого экземпляра.
Расширяемость: Можно добавлять новые методы в прототип, и они сразу станут доступны всем объектам, которые наследуют этот прототип.
Через Object.create()
Вы явно указываете, какой объект будет прототипом.
const animal = { eats: true };
const rabbit = Object.create(animal);
console.log(rabbit.eats); // trueЧерез функции-конструкторы
Функции-конструкторы автоматически связывают созданный объект с прототипом через свойство prototype.
function Animal(name) {
this.name = name;
}
Animal.prototype.eats = true;
const dog = new Animal("Собака");
console.log(dog.eats); // trueЧерез классы
Классы в JavaScript — это удобная обёртка над прототипным наследованием.
class Animal {
constructor(name) {
this.name = name;
}
walk() {
console.log(`${this.name} гуляет`);
}
}
const cat = new Animal("Кошка");
cat.walk(); // "Кошка гуляет"const grandparent = { heritage: "ancient" };
const parent = Object.create(grandparent);
parent.legacy = "modern";
const child = Object.create(parent);
console.log(child.heritage); // "ancient" (из grandparent)
console.log(child.legacy); // "modern" (из parent)Прототипы часто используются для создания иерархий объектов, например:
В веб-разработке — методы Array или Object (например, push, map, toString) определены в их прототипах.
В больших приложениях — для наследования общих функций между объектами.
Прототип — это основа системы наследования в JavaScript, которая позволяет создавать гибкие и экономичные структуры объектов. Знание этой концепции помогает глубже понять, как работают встроенные объекты и классы в JavaScript.