04. Subclassing

Ключевое слово extends позволяет создать класс на основе уже существующего конструктора.

class Child extends Parent {
  constructor(...props) {
    super(...props);
  }
}

На месте extends может стоять любое выражение, возвращающее функцию-конструктор или null.

class Foo extends combine(MyMixin, MySuperClass) {}

При наследовании через extends формируется стандартная цепочка прототипов.

let cp = new ColorPoint(25, 8, "green");

Особенности наследования:

  • Наследование одиночное;

  • Статические методы наследуются;

  • В ES6 можно выполнять наследование стандартных библиотечных конструкторов, таких как Array, Error.

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

Prototype Chains

В реальности формируется две цепочки прототипов:

  • Слева формируется цепочка конструкторов: прототипом дочернего класса является его родительский класс.

  • Справа формируется цепочка прототипов объектов.

super()

Обращение к родительскому классу выполняется при помощи ключевого слова super:

  • В конструкторе класса super(...) вызывает конструктор суперкласса. Если конструктор суперкласса не вызван явно, то будет выброшено исключение.

  • В определениях методов super ссылается на прототип из родительского конструктора.

Конструктор класса родителя наследуется автоматически. То есть, если в потомке не указан свой constructor, то используется родительский. Если же у потомка свой constructor, то чтобы в нём вызвать конструктор родителя — используется синтаксис super() с аргументами для родителя.

  • Вызвать конструктор родителя можно только изнутри конструктора потомка. В частности, super() нельзя вызвать из произвольного метода.

  • В конструкторе потомка мы обязаны вызвать super() до обращения к this. До вызова super не существует this, так как по спецификации в этом случае именно super инициализирует this.

Last updated