ES6中,super
关键字在类继承中扮演着非常重要的角色。它有两个主要的作用:
-
在子类构造函数中调用父类的构造函数:在使用ES6类继承时,子类的构造函数需要调用父类的构造函数,这是通过
super()
实现的。这使得子类能够继承父类的属性。如果不调用super()
,则子类的实例将无法正确构建,因为父类的一些初始化代码不会被执行。例如,假设我们有一个
Person
类和一个继承自Person
的Student
类:javascriptclass Person { constructor(name) { this.name = name; } } class Student extends Person { constructor(name, studentID) { super(name); // 调用父类的构造函数来初始化父类中定义的属性 this.studentID = studentID; } } let student = new Student('Alice', '12345'); console.log(student.name); // 输出: Alice
在这个例子中,
super(name)
调用了Person
类的构造函数,初始化了name
属性。 -
在子类的方法中调用父类的方法:
super
也可以用来在子类中调用父类的方法。这对于扩展和重写父类行为非常有用。在子类的方法中,你可以通过super.methodName()
的方式调用父类的方法。例如:
javascriptclass Person { greet() { console.log(`Hello, my name is ${this.name}.`); } } class Student extends Person { study() { console.log(`${this.name} is studying with student ID ${this.studentID}.`); } greet() { super.greet(); // 调用父类的greet方法 this.study(); // 然后调用子类的study方法 } } let student = new Student('Alice', '12345'); student.greet(); // 输出: // Hello, my name is Alice. // Alice is studying with student ID 12345.
在这个例子中,我们重写了Student
类的greet
方法,在其中首先通过super.greet()
调用了父类Person
中的greet
方法,然后调用了Student
自己的study
方法,这样就可以保留父类的行为的同时扩展新的行为。
综上所述,super
在ES6类继承中是极为重要的,它允许子类构造函数和方法访问和调用父类的构造函数和方法。