... кажется, обязательно иметь функцию конструктора в базовом классе.
Не совсем. Если вы его не предоставили, один будет предоставлен вам движком JavaScript. Таким образом, всегда будет один (в этом смысле он обязателен), но его не нужно кодировать явно.
Когда вы вообще не определяете конструктор, конструктор по умолчанию, предоставляемый движком JavaScript для базового класса, будет выглядеть так:
constructor( ) { }
... и по умолчанию в производном классе будет выглядеть так:
constructor(...args) {
super(...args);
}
Причина, по которой ваш пример не работает, заключается в том, что Derived
имеет явный constructor
, но constructor
не вызывает super
. Вы должны вызывать super
из конструктора Derived
, если вы явно определяете его.
если у производного класса есть конструктор, почему обязательно вызывать super из производного конструктора?
Потому что вы должны дать суперклассу возможность выполнить любую инициализацию нового объекта, которую он должен выполнить. В противном случае суперкласс не может гарантировать правильную работу, поскольку он может полагаться на инициализацию, выполненную его конструктором.
Так что либо:
Удалите свой constructor
из Derived
, сделав его похожим на ваш первый пример, чтобы движок JavaScript предоставил конструктор по умолчанию, или
Вызовите super
из конструктора Derived
.
В комментарии вы спросили:
но если базовый класс не имеет никакого конструктора, он все равно терпит неудачу, если производный класс имеет
Базовый класс всегда имеет конструктор, потому что, если вы его не предоставите (вы сделали это в коде в своем вопросе), предоставляется значение по умолчанию. Так что все равно придется звонить. Хотя его можно указать как необязательный, если ни один из суперклассов не имеет конструктора, отличного от значения по умолчанию, это добавило бы сложности и сделало бы явный конструктор Derived
вводящим в заблуждение (без вызова super
).
Есть также некоторые механические причины: this
не определен, пока вы не вызовете super
, но вам разрешено делать что-то до вызова super
, поэтому выполнение вызова необходимо для обработки механики this
в спецификации.
person
T.J. Crowder
schedule
29.12.2016