TypeScript 继承实现:不使用 extends 时如何继承父类并保留子类方法

在 TypeScript 中,通常使用 extends 关键字来实现继承。但是,在某些情况下,可能需要在不使用 extends 的情况下实现继承。例如,当需要在运行时动态地创建子类,或者无法修改父类代码时,就需要使用其他方法来实现继承。

问题:

当需要在 TypeScript 中实现继承,但不能使用 extends 关键字,并且不能使用中间类时,可以使用 Object.assignObject.setPrototypeOf 方法来实现继承。但是,Object.assign 无法合并原型链,而 Object.setPrototypeOf 会覆盖子类的原型链,导致子类方法丢失。

解决方案:

可以使用 Object.create 方法来实现继承,并保留子类方法。

代码示例:

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

const parent = new Parent();

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

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

解释:

  1. Child 类的构造函数中,使用 Object.create(parent) 创建一个新的对象 childPrototype,并将其原型设置为 parent
  2. 使用 Object.setPrototypeOf(this, childPrototype)Child 类实例的原型设置为 childPrototype,从而实现了继承。

结论:

通过使用 Object.create 方法,可以实现继承,并保留子类方法。这为在不使用 extends 关键字的情况下实现继承提供了另一种解决方案。

其他注意事项:

  • Object.create 方法创建的对象没有自己的属性,只有从原型链继承的属性。
  • Object.setPrototypeOf 方法不会修改实例的原型链,而是将实例的原型设置为指定的原型。

希望本文对你有所帮助!


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

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