在构造函数中使用 super
- 使用规则:
- 在子类构造函数中,如果要访问
this
,必须先调用 super()
。这是因为在子类构造函数中,this
的初始化依赖于父类构造函数的执行。
super()
必须在子类构造函数的第一行调用。
- 示例代码:
class Animal {
name: string;
constructor(name: string) {
this.name = name;
}
}
class Dog extends Animal {
breed: string;
constructor(name: string, breed: string) {
super(name);
this.breed = breed;
}
}
- 注意事项:
- 如果子类没有显式定义构造函数,TypeScript 会自动生成一个默认构造函数,该构造函数会调用
super()
。
- 如果子类构造函数显式定义了构造函数,必须调用
super()
,除非该子类是抽象类。
在普通方法中使用 super
- 使用规则:
super
用于调用父类的普通方法。通过 super
,可以访问父类中定义的方法。
- 示例代码:
class Animal {
move(distanceInMeters: number = 0) {
console.log(`Animal moved ${distanceInMeters}m.`);
}
}
class Dog extends Animal {
move(distanceInMeters: number = 5) {
super.move(distanceInMeters);
console.log(`Dog moved ${distanceInMeters}m.`);
}
}
- 注意事项:
super
只能在类的方法内部使用,不能在类的外部或函数中使用。
- 在使用
super
调用父类方法时,要注意父类方法的参数和返回值类型,确保调用的正确性。
子类重写父类方法时 super
调用的时机与作用
- 调用时机:
- 通常在子类重写的方法中,可以在任何位置调用
super
来调用父类的同名方法。常见的是在子类方法逻辑开始时或结束时调用。
- 作用:
- 在子类重写方法中调用
super
,可以复用父类方法的部分逻辑,同时在其基础上添加子类特有的逻辑。例如,在上述 Dog
类的 move
方法中,先调用 super.move(distanceInMeters)
执行父类 Animal
的 move
方法逻辑,然后再添加 Dog
类特有的输出逻辑。这样既保留了父类的核心行为,又实现了子类的扩展。