Files
frontend-docs/docs/javascript/06-classes/02-inheritance-classes.md
2025-03-05 15:12:57 +03:00

2.9 KiB
Raw Blame History

sidebar_position
sidebar_position
2

Наследование классов

Наследование классов это способ расширения одного класса другим классом. Таким образом, мы можем добавить новый функционал к уже существующему.

  1. Чтобы унаследовать от класса: class Child extends Parent: -При этом Child.prototype.proto будет равен Parent.prototype, так что методы будут унаследованы.
  2. При переопределении конструктора:
    • Обязателен вызов конструктора родителя super() в конструкторе Child до обращения к this.
  3. При переопределении другого метода:
    • Мы можем вызвать super.method() в методе Child для обращения к методу родителя Parent.
  4. Внутренние детали:
    • Методы запоминают свой объект во внутреннем свойстве HomeObject. Благодаря этому работает super, он в его прототипе ищет родительские методы.
    • Поэтому копировать метод, использующий super, между разными объектами небезопасно.
  • У стрелочных функций нет своего this и super, поэтому они «прозрачно» встраиваются во внешний контекст.

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

Синтаксис создания класса допускает указывать после extends не только класс, но и любое выражение. Пример вызова функции, которая генерирует родительский класс:

function f(phrase) {
  return class {
    sayHi() { alert(phrase); }
  };
}
class User extends f("Привет") {}
new User().sayHi(); // Привет

Здесь class User наследует от результата вызова f("Привет").

Переопределение методов

class Rabbit extends Animal {
  stop() {
    // ...теперь это будет использоваться для rabbit.stop()
    // вместо stop() из класса Animal
  }
}

У классов есть ключевое слово "super", чтобы сделать новый на его основе, изменяя или расширяя его функциональность

super.method(...) вызывает родительский метод. super(...) для вызова родительского конструктора (работает только внутри нашего конструктора).