如果我可以通过这个调用父方法那么为什么要在 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
结果:this和superreturns输出相同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);
}
}
假设我们有一个 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
结果:this和superreturns输出相同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);
}
}