如果我可以通过这个调用父方法那么为什么要在 ES6 中使用 super ?

If i can call the parent methods via this then why to use the super in ES6?

假设我们有一个 class ABC:

class ABC{
    constructor(param1, param2){
        this.prop1 = param1;
        this.prop2 = param2;
    }
    ABCMethod1(){
        console.log(this.prop1 + ' ' + this.prop2);
    }
}

和另一个class XYZ 扩展 class ABC:

class XYZ extends ABC{
    XYZMethod1(){
        this.ABCMethod1();
    }
}

因此,ES6 引入了一个新关键字super,用于访问子class 中的父class 成员。但是我可以通过使用 this:

非常容易地访问子 class 中的父 class 成员
var myObject = new XYZ('Property 1','Property 2');
myObject.XYZMethod1();

在浏览器控制台打印以下内容:

Property 1 Property 2

现在让我们通过在子 class 中使用 super 而不是 this 来做同样的事情]XYZ:

class XYZ extends ABC{
    XYZMethod1(){
        super.ABCMethod1();
    }
}

现在让我们再次调用 XYZmethod1() 以查看结果:

var myObject = new XYZ('Property 1','Property 2');
myObject.XYZMethod1();

在浏览器控制台打印以下内容:

Property 1 Property 2

结果:thissuperreturns输出相同Property 1 Property 2 在控制台中。那么,如果我们可以使用 this 访问父方法,那么 ES6 中 super 的目的是什么,我们为什么要使用它?谁能用简单的语言举例说明?

调用超类的构造函数更容易:

 constructor() {
   super("param 1", "param 2");
 }

如果超类的方法被子类(同名)覆盖,调用超类的方法变得很容易:

 class Animal {
  move() {
   console.log("moves");
  }
}

class Bird extends Animal {
 move() {
  super.move();
  // this.move() would end into endless recursion
  console.log("flies");
 }
}

如果您在父项和子项 class 中定义了 相同的方法super 明确允许您获取父项的实现。是的,Javascript(以及几乎所有其他 OOP 语言)将向上遍历原型链以查找在父项上定义的属性,因此您 不需要 它来调用父项的方法.事实上,您不一定知道一个方法定义了多少层,所以 需要 它是疯狂的。当存在不止一种可能的实现(当前 class 或其父级)时,您只需要它来消除歧义。

这个多用于重写父类实现,但又想调用父类实现的情况:

class Foo {
    constructor() {}
    bar() {}
}

class Baz {
    constructor() {
        super();
        console.log(42);
    }

    bar() {
        super.bar();
        console.log(42);
    }
}