PassFront
  1. PassFront
  2. База знаний
  3. Объекты и прототипы

Как в 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 — сахар над прототипами. Методы в прототипе общие для экземпляров.

Другие вопросы раздела