Как в JS устроено наследование?
Объекты и прототипы
В JavaScript наследование устроено через прототипы: у каждого объекта есть ссылка на прототип (`[[Prototype]]`), и свойства ищутся по цепочке прототипов. `class` — синтаксический сахар над этим.
Прототипное наследование
У объекта есть внутренняя ссылка [[Prototype]] (доступна как __proto__) на объект-прототип. При обращении к свойству движок ищет его в объекте, затем в прототипе, затем в прототипе прототипа — по цепочке до null:
const animal = { eat() { return 'ест'; } };
const dog = Object.create(animal); // dog наследует от animal
dog.eat(); // 'ест' — найдено в прототипеЧерез конструкторы
Функции-конструкторы имеют свойство prototype, которое становится прототипом экземпляров:
function Animal(name) { this.name = name; }
Animal.prototype.eat = function () { return `${this.name} ест`; };
const a = new Animal('Рекс');
a.__proto__ === Animal.prototype; // trueЧерез class (сахар)
class Animal {
eat() { return 'ест'; }
}
class Dog extends Animal {
bark() { return 'Гав'; }
}class/extends/super — удобный синтаксис над прототипами: Dog.prototype.__proto__ === Animal.prototype.
Главное
- Наследование — от объектов (прототипов), а не от классов.
- Поиск свойств — вверх по цепочке прототипов до
null. - Методы хранятся в прототипе один раз (общие для экземпляров).
Коротко для собеседования
В JS наследование прототипное: объект имеет [[Prototype]] (__proto__), свойства ищутся по цепочке прототипов до null. Конструкторы задают прототип экземпляров через prototype, при new устанавливается instance.__proto__ = Constructor.prototype. class/extends/super — сахар над прототипами. Методы в прототипе общие для экземпляров.