super 关键字

105 阅读1分钟

当我们想要继承并且想覆盖掉父类的方法,我们可以直接在子类声明同名的方法即可。可是想覆盖掉属性这样却不可以。

class Animal {
  name: string;
  age: number;

  constructor(name: string, age: number) {
    this.name = name;
    this.age = age;
  }

  sayName() {
    console.log(this.name);
  }
}

class Dog extends Animal {
  name: string;
  age: number;
  
  //会在这里提示    派生类的构造函数必须包含 "super" 调用。
  constructor(name: string, age: number) {
  
  // 就是说,这里要这样调用 super(name,age);
    this.name = name;
    this.age = age;
  }
}

const d = new Dog("小狗", 2);

super函数代表的就是父类(Animal),而父类里需要传入两个参数name,age。所以要这样调用super(name,age)

为什么要super()?

ES6中,先有父类,然后子类继承后得到与父类同样的属性和方法,之后再添加自己的属性和方法。只要子类继承了父类,无论是否重写属性,都必须要在 constructor 函数中调用super函数,如果自己不调用,程序会默认调用