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

Javascript 如果我可以通过这个调用父方法,那么为什么要在ES6中使用super?,javascript,ecmascript-6,super,ecma,Javascript,Ecmascript 6,Super,Ecma,假设我们有一节课ABC: class ABC{ constructor(param1, param2){ this.prop1 = param1; this.prop2 = param2; } ABCMethod1(){ console.log(this.prop1 + ' ' + this.prop2); } } class XYZ extends ABC{ XYZMethod1(){ t

假设我们有一节课ABC:

class ABC{
    constructor(param1, param2){
        this.prop1 = param1;
        this.prop2 = param2;
    }
    ABCMethod1(){
        console.log(this.prop1 + ' ' + this.prop2);
    }
}
class XYZ extends ABC{
    XYZMethod1(){
        this.ABCMethod1();
    }
}
var myObject = new XYZ('Property 1','Property 2');
myObject.XYZMethod1();
class XYZ extends ABC{
    XYZMethod1(){
        super.ABCMethod1();
    }
}
var myObject = new XYZ('Property 1','Property 2');
myObject.XYZMethod1();
以及另一个类XYZ,该类扩展了ABC

class ABC{
    constructor(param1, param2){
        this.prop1 = param1;
        this.prop2 = param2;
    }
    ABCMethod1(){
        console.log(this.prop1 + ' ' + this.prop2);
    }
}
class XYZ extends ABC{
    XYZMethod1(){
        this.ABCMethod1();
    }
}
var myObject = new XYZ('Property 1','Property 2');
myObject.XYZMethod1();
class XYZ extends ABC{
    XYZMethod1(){
        super.ABCMethod1();
    }
}
var myObject = new XYZ('Property 1','Property 2');
myObject.XYZMethod1();
因此,ES6引入了一个新关键字super,用于访问子类中的父类成员。但是我可以使用this很容易地访问子类中的父类成员:

class ABC{
    constructor(param1, param2){
        this.prop1 = param1;
        this.prop2 = param2;
    }
    ABCMethod1(){
        console.log(this.prop1 + ' ' + this.prop2);
    }
}
class XYZ extends ABC{
    XYZMethod1(){
        this.ABCMethod1();
    }
}
var myObject = new XYZ('Property 1','Property 2');
myObject.XYZMethod1();
class XYZ extends ABC{
    XYZMethod1(){
        super.ABCMethod1();
    }
}
var myObject = new XYZ('Property 1','Property 2');
myObject.XYZMethod1();
在浏览器控制台中打印以下内容:

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

class ABC{
    constructor(param1, param2){
        this.prop1 = param1;
        this.prop2 = param2;
    }
    ABCMethod1(){
        console.log(this.prop1 + ' ' + this.prop2);
    }
}
class XYZ extends ABC{
    XYZMethod1(){
        this.ABCMethod1();
    }
}
var myObject = new XYZ('Property 1','Property 2');
myObject.XYZMethod1();
class XYZ extends ABC{
    XYZMethod1(){
        super.ABCMethod1();
    }
}
var myObject = new XYZ('Property 1','Property 2');
myObject.XYZMethod1();
现在,让我们再次调用XYZmethod1()以查看结果:

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

Property 1 Property 2
Property 1 Property 2

结果:
超级在控制台中返回相同的输出
属性1属性2
。因此,如果我们可以使用this访问父方法,那么在ES6中super的目的是什么,我们为什么要使用它?任何人都可以用简单的语言举例说明吗?

这样调用超类的构造函数就更容易了:

 constructor() {
   super("param 1", "param 2");
 }
如果超类的方法被子类(具有相同的名称)覆盖,则可以很容易地调用该超类的方法:


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

 constructor() {
   super("param 1", "param 2");
 }
如果超类的方法被子类(具有相同的名称)覆盖,则可以很容易地调用该超类的方法:

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

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

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

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

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

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

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

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

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

它的nore或更多?它的nore或更多?为什么在子类中使用构造函数(){super();console.log(42);}在子类中这有什么意义?它执行父类的构造函数,并在自己的构造函数中执行某些操作。这个特殊的例子当然没有什么有趣的,它只是演示了这个原理。即使我们可以在没有构造函数()的情况下调用Baz类中的super.bar(){super();console.log(42);},那么为什么要使用构造函数(){super();console.log(42);}?请详细说明一下,这些都是独立的例子。它显示被重写的构造函数和父类的构造函数被调用,它显示被重写的
bar
和父类的
bar
被调用。为什么在子类中使用构造函数(){super();console.log(42);}在子类中这有什么意义?它执行父类的构造函数,并且在它自己的构造函数中也做了一些事情。这个特殊的例子当然没有什么有趣的,它只是演示了这个原理。即使我们可以在没有构造函数()的情况下调用Baz类中的super.bar(){super();console.log(42);},那么为什么要使用构造函数(){super();console.log(42);}?请详细说明一下,这些都是独立的例子。它显示被重写的构造函数和调用的父构造函数,并显示被重写的
bar
和调用的父构造函数的
bar