В чём суть
extends связывает конструкторы и прототипы. В наследнике перед обращением к this нужно вызвать super(). super.method() вызывает поведение родителя.
Подробности
class Animal {
constructor(name) {
this.name = name;
}
speak() {
console.log(`${this.name} makes a noise.`);
}
}
class Dog extends Animal {
constructor(name, breed) {
super(name);
this.breed = breed;
}
speak() {
console.log(`${this.name} barks.`);
}
}
const dog = new Dog('Rex', 'German Shepherd');
dog.speak();
Наследование уместно при настоящей подстановке (LSP). Для опциональных способностей чаще лучше композиция.
Итог
extends + обязательный super() в derived-конструкторе; предпочитайте композицию, если иерархия раздувается.