← Назад ко всем вопросам

Как работает наследование классов (extends, super) и как это связано с прототипной моделью?

1️⃣ Как кратко ответить

Наследование классов в JavaScript реализуется с помощью ключевых слов extends и super. extends позволяет одному классу наследовать свойства и методы другого класса, а super используется для вызова конструктора родительского класса и доступа к его методам. Это связано с прототипной моделью, так как классы в JavaScript являются синтаксическим сахаром над прототипами, и наследование классов фактически работает через цепочку прототипов.

2️⃣ Подробное объяснение темы

Наследование классов в JavaScript позволяет создавать новые классы на основе существующих, что способствует повторному использованию кода и упрощает его организацию. Это достигается с помощью ключевых слов extends и super.

Ключевое слово extends

extends используется для создания класса, который наследует свойства и методы другого класса. Это позволяет новому классу (называемому подклассом) использовать функциональность существующего класса (называемого суперклассом).

Пример:

class Animal {
  constructor(name) {
    this.name = name; // Инициализация свойства name
  }
​
  speak() {
    console.log(`${this.name} издает звук.`); // Метод, который выводит сообщение
  }
}
​
class Dog extends Animal {
  constructor(name, breed) {
    super(name); // Вызов конструктора суперкласса с передачей параметра name
    this.breed = breed; // Инициализация дополнительного свойства breed
  }
​
  speak() {
    console.log(`${this.name} лает.`); // Переопределение метода speak для класса Dog
  }
}
​
const dog = new Dog('Рекс', 'Овчарка');
dog.speak(); // Вывод: "Рекс лает."

Ключевое слово super

super используется для вызова конструктора суперкласса и доступа к его методам. Это необходимо, чтобы правильно инициализировать объект подкласса, используя логику суперкласса.

  • В конструкторе подкласса super должен быть вызван до обращения к this, иначе будет ошибка.
  • super также может использоваться для вызова методов суперкласса из методов подкласса.

Прототипная модель

JavaScript изначально использует прототипное наследование, где объекты могут наследовать свойства и методы от других объектов. Классы в JavaScript — это синтаксический сахар над этой моделью. Когда вы создаете класс и используете extends, JavaScript за кулисами создает цепочку прототипов, связывая объекты.

  • Каждый класс в JavaScript имеет свой прототип, который ссылается на прототип его суперкласса.
  • Это позволяет объектам подкласса иметь доступ к методам и свойствам суперкласса через цепочку прототипов.

Пример прототипной цепочки

console.log(dog instanceof Dog); // true
console.log(dog instanceof Animal); // true
  • dog является экземпляром как Dog, так и Animal, благодаря цепочке прототипов.
  • Dog.prototype ссылается на Animal.prototype, что позволяет dog использовать методы Animal.

Наследование классов в JavaScript упрощает создание сложных структур данных и способствует более чистому и поддерживаемому коду, сохраняя при этом мощь и гибкость прототипного наследования.

Тема: JavaScript
Стадия: Tech

🔒 Подпишись на бусти автора и стань Алигатором, чтобы получить полный доступ к функционалу сайта и отслеживать свой прогресс!

Твои заметки