TypeScript 继承实现:不使用 extends 关键字的原型链方法

在 TypeScript 中,通常使用 extends 关键字实现继承。然而,当需要在不使用 extends 的情况下实现继承,并且需要保留子类方法时,可以使用原型链的方式。

问题背景:

假设我们有两个类,ParentChildParent 类拥有 methodAmethodB 方法,Child 类需要继承 Parent 类的方法,并且需要添加自己的 methodC 方法。

常见的错误方法:

  • 使用 Object.assign: Object.assign 无法合并原型对象 (prototype),因此无法实现继承。
  • 使用 Object.setPrototypeOf: Object.setPrototypeOf 会修改自身原型对象 (prototype),导致子类的 methodC 方法丢失。

解决方案:原型链继承

  1. 创建一个新的空对象作为子类的原型。
  2. 将父类的原型赋值给这个空对象的原型。

这样,子类就可以继承父类的方法,同时保留自己的新方法。

示例代码:

class Parent {
  constructor() {}
  public methodA() {}
  public methodB() {}
}

class Child {
  constructor() {
    const childPrototype = Object.create(Parent.prototype);
    Object.setPrototypeOf(this, childPrototype);
  }
  public methodC() {}
}

const child = new Child();
child.methodA();
child.methodB();
child.methodC();

解释:

  1. Child 的构造函数中,首先创建了一个空对象 childPrototype,并将其原型设置为 Parent.prototype
  2. 然后,使用 Object.setPrototypeOfchildPrototype 设置为当前实例的原型。

通过这种方式,Child 继承了 Parent 的方法,同时保留了自己的 methodC 方法。

总结:

本文介绍了在 TypeScript 中,不使用 extends 关键字,通过原型链的方式实现继承,并保留子类方法的技巧。这种方法可以避免使用 Object.assignObject.setPrototypeOf 导致的问题,同时提供了灵活的继承方式。


原文地址: https://www.cveoy.top/t/topic/o0FQ 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录