0

假设我们有一个类ABC

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

还有一个扩展ABC的类XYZ

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

因此,ES6 引入了一个新的关键字super,用于访问子类中的父类成员。但是我可以通过使用以下方法很容易地访问子类中的父类成员:

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

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

Property 1 Property 2

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

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

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

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

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

Property 1 Property 2

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

4

2 回答 2

3

它使调用超类的构造函数变得更加容易:

 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");
 }
}
于 2018-10-01T08:57:36.473 回答
2

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

这主要用于覆盖父级的实现,但仍想调用父级的实现:

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

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

    bar() {
        super.bar();
        console.log(42);
    }
}
于 2018-10-01T08:58:01.957 回答