ES6 中使用 super 方法实现父类成员引用的详解

在 ES6 中,我们可以使用 super 方法来引用父类中的成员,以及在子类中调用父类的构造函数。super 的使用方法与 this 相似,它是一个关键字,而不是一个变量或方法。在本篇文章中,我们将详细介绍 super 的用法,并提供代码示例来帮助读者更好地理解。

什么是 super

在 ES6 中,super 是一个表示父类的关键字。子类可以通过 super 关键字调用父类中的 constructor、成员方法和静态方法,它的语法如下:

super([arguments]); // 用于子类中调用父类的 constructor
super.member; // 用于访问父类的成员
super([arguments]).member; // 用于调用父类的成员方法

在构造函数中使用 super

子类需要调用父类的 constructor,可以通过使用 super() 方法来实现。这样便能继承并创建父类的实例,子类继承了父类的属性和方法,子类实例也具有了父类实例的所有属性。

class Parent {
  constructor(x, y) {
    this.x = x;
    this.y = y;
  }  
}

class Child extends Parent {
  constructor(x, y, z) {
    super(x, y); // 调用父类的 constructor,传参 x 和 y
    this.z = z;
  }

  print() {
    console.log(this.x + this.y + this.z);
  }
}

let child = new Child(1, 2, 3); 
child.print(); // 输出 6

代码解释:

  1. Child 类的 constructor 中,我们使用 super(x, y) 调用了 Parent 类的 constructor,并传递了参数 xy,从而实现了子类继承父类的属性。
  2. Child 类中的 print() 方法可以访问父类 Parent 类的两个属性 xy,以及子类 Child 自己的属性 z

调用父类的成员

通过使用 super 关键字,我们可以在子类中访问父类的成员(包括属性和方法)。在使用 super 访问父类的成员时,我们需要使用 super.member 的形式(member 可以是属性或方法名称),以便明确指出我们希望调用父类的成员。

class Parent {
  constructor(x, y) {
    this.x = x;
    this.y = y;
  }

  add() {
    return this.x + this.y;
  }
}

class Child extends Parent {
  constructor(x, y, z) {
    super(x, y);
    this.z = z;
  }

  add() {
    return super.add() + this.z; // 调用父类 add 方法,并在此基础上加上 z
  }

  print() {
    console.log(this.add());
  }
}

let child = new Child(1, 2, 3);
child.print(); // 输出 6

代码解释:

  1. Child 类中重写了父类 Parent 中的 add() 方法,并使用 super.add() 访问了父类 Parent 中的 add() 方法,并在此基础上加上了 Child 类自己的属性 z 的值。
  2. Child 类的 print() 方法中调用了子类 Child 中重写的 add() 方法,并打印出了它的返回值。在这个例子中,print() 方法打印出了 x + y + z 的值。

指导意义与总结

通过本篇文章的介绍,我们可以了解到 super 关键字的使用方法和技巧,以及它在 ES6 中的重要性。使用 super 可以通过一个简单的语法,让子类轻松调用父类的成员变量或成员方法。同时,当我们继承并重写父类成员时,可以使用 super 便捷地访问父类的成员。掌握使用 super 的方法对于掌握 JavaScript 基础编程技能具有重要的意义。

总结起来,super 是一种非常有用的功能,它能够帮助我们更好地编写命令式、面向对象的 JavaScript 代码。它的使用方法对于初学者来说可能会比较难理解,但是熟悉一些基本的继承和面向对象的编程知识后,使用 super 就能变得十分简单。

来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/65a38dd0add4f0e0ffbb248a


纠错反馈