为什么我需要使用super()访问基类构造函数?

时间:2016-08-05 09:46:09

标签: javascript ecmascript-6

为什么我需要在子类中引用基类的构造函数?无论如何,我似乎得到了同样的结果。

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

1 个答案:

答案 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中定义:

  
      
  1. 如果构造函数为空,则

         
        
    • 如果 ClassHeritage opt 存在,那么

           
          
      • 构造函数成为解析源文本的结果

        constructor(... args){ super (...args);}
        
             

        使用带有目标符号 MethodDefinition 的句法语法。

      •   
    •   
    • 否则,

           
          
      • 构造函数成为解析源文本的结果

        constructor( ){ }
        
             

        使用带有目标符号 MethodDefinition 的句法语法。

      •   
    •   
  2.   

1 如果它不是一个子类,如上所示,它只是constructor() { }

相关问题