TypeScript中如何正确使用父类方法与extends关键字?附类实现示例
在TypeScript中正确使用extends关键字与父类方法
首先帮你梳理下你代码里的关键问题:父类里用箭头函数定义的baseMethod1、baseMethod2其实不是类的原型方法,而是实例属性,这会导致子类继承时出现this绑定异常、无法重写等隐患。下面一步步给你拆解正确的用法:
一、extends的基础使用规则
当子类通过extends继承父类时,必须遵守两个核心要求:
- 子类的构造函数必须调用
super(),而且要在访问this之前执行——它会触发父类的构造逻辑,完成父类属性的初始化 - 子类可以直接继承父类的原型方法,也可以重写父类方法,或者通过
super.方法名()调用父类的原始实现
二、你代码里的隐患:箭头函数作为类方法的问题
你父类里的写法:
baseMethod1 = (objToLog): void => { //do stuff }
这种箭头函数是作为实例属性存在的,它的this会被永久绑定到父类实例上,子类即使重写这个方法也无法改变this指向;而且这类方法不会挂载到父类的原型链上,每个子类实例都会创建一份方法副本,造成内存浪费。
三、修正后的完整代码示例
我们把父类的方法改成标准的原型方法,再实现子类的正确继承:
// 假设你已定义如下接口 interface IBaseLogService { baseMethod1(objToLog: any): void; baseMethod2(objToLog: any): void; } interface ILocalLogService extends IBaseLogService { localLogHandler(): void; // 子类独有的方法 } export abstract class BaseLogService implements IBaseLogService { static $inject: string[] = ['$http']; constructor(private $http: ng.IHttpService){ } // 改为原型方法,不用箭头函数 baseMethod1(objToLog: any): void { // 父类核心逻辑 console.log('父类baseMethod1执行', objToLog); } baseMethod2(objToLog: any): void { // 父类核心逻辑 console.log('父类baseMethod2执行', objToLog); } } class LocalLogService extends BaseLogService implements ILocalLogService { // 子类构造函数:必须调用super传递父类依赖 constructor($http: ng.IHttpService){ super($http); // 调用父类构造函数,传入$http } // 子类重写父类方法 baseMethod1(objToLog: any): void { // 先调用父类的baseMethod1逻辑 super.baseMethod1(objToLog); // 添加子类自己的扩展逻辑 console.log('LocalLogService扩展baseMethod1的逻辑'); } // 实现子类独有的方法,满足ILocalLogService要求 localLogHandler(): void { console.log('子类专属的本地日志处理'); // 子类方法中也可以直接调用父类的其他方法 this.baseMethod2({ source: 'local' }); } }
四、额外注意点
- 如果父类是抽象类(
abstract),子类必须实现父类中声明的抽象方法(如果有的话) - 依赖注入层面:父类已经声明了
$inject,子类如果没有额外依赖,不需要重复声明;如果有新依赖,要在$inject里追加并在super()中传递 - 调用父类方法时,务必用
super.方法名(),而不是this.方法名()——后者会优先调用子类的重写实现
内容的提问来源于stack exchange,提问作者Chris
相关产品推荐
相关产品推荐

