为什么我需要在子类中引用基类的构造函数?无论如何,我似乎得到了同样的结果。
class Animal {
constructor(age) {
this.age = age;
}
}
class Mammal extends Animal {}
let lion = new Mammal(3);
lion.age //=> 3
而不是
class Mammal extends Animal {
constructor(){
super(3)
}
}
let lion = new Mammal();
lion.age //=> 3
答案 0 :(得分:3)
如果您没有提供显式构造函数,则在子类 1 中,JavaScript引擎将为您生成一个如下所示:
constructor(...args) {
super(...args);
}
在你的第一个例子中发生了什么。所以这个:
class Mammal extends Animal {
}
与此相同:
class Mammal extends Animal {
constructor(...args) {
super(...args);
}
}
...它只是第二个是显式的,而第一个是使用JavaScript引擎为你插入的构造函数。
这在§14.5.14: Runtime Semantics: ClassDefinitionEvaluation的步骤10中定义:
- 醇>
如果构造函数为空,则
如果 ClassHeritage opt 存在,那么
让构造函数成为解析源文本的结果
constructor(... args){ super (...args);}
使用带有目标符号 MethodDefinition 的句法语法。
否则,
让构造函数成为解析源文本的结果
constructor( ){ }
使用带有目标符号 MethodDefinition 的句法语法。
1 如果它不是一个子类,如上所示,它只是constructor() { }
。