ES6中class语法糖的super关键字
在ES6(ECMAScript 2015)中,class
是一种语法糖,用于定义类和实现继承。super
关键字在类继承中扮演着重要的角色,它用于调用父类的构造函数或方法。
构造器中的 super
当你在子类中定义构造函数时,通常需要调用父类的构造函数来确保父类的初始化逻辑被执行。super
关键字用于这个目的。
示例
假设我们有一个父类 Animal
和一个子类 Dog
,Dog
继承自 Animal
:
class Animal {
constructor(name) {
this.name = name;
}
speak() {
console.log(`${this.name} makes a sound.`);
}
}
class Dog extends Animal {
constructor(name, breed) {
// 调用父类的构造函数
super(name);
this.breed = breed;
}
speak() {
console.log(`${this.name} barks.`);
}
}
const dog = new Dog('Rex', 'Golden Retriever');
dog.speak(); // 输出: Rex barks.
console.log(dog.name); // 输出: Rex
console.log(dog.breed); // 输出: Golden Retriever
在这个例子中:
Dog
类通过extends
关键字继承了Animal
类。- 在
Dog
类的构造函数中,super(name)
调用了Animal
类的构造函数,并将name
传递给它。这样,Dog
实例的name
属性就被正确初始化了。 Dog
类还定义了自己的speak
方法,覆盖了Animal
类中的speak
方法。
注意事项
- 必须在子类构造函数中调用
super
:在子类的构造函数中,必须在使用this
关键字之前调用super
。这是因为super
负责初始化this
。 - 继承静态方法:
super
也可以用来调用父类的静态方法。
示例:继承静态方法
class Animal {
static species() {
return 'Animal';
}
}
class Dog extends Animal {
static species() {
return super.species() + ' Dog';
}
}
console.log(Dog.species()); // 输出: Animal Dog
在这个例子中,Dog
类通过 super.species()
调用了 Animal
类的静态方法 species
。
总结来说,super
关键字在类继承中用于调用父类的构造函数或方法,确保子类能够正确初始化和继承父类的属性和方法。