破解 import 语句以扩展继承的 class

Hacking the import statement to extend an inherited class

在我希望在不修改其代码的情况下扩展的库中,有几个 类 继承自同一个导入的库。那就是在这个 BaseClass 我需要覆盖一个特定的方法。

import { BaseClass } from './base_class';
export class ClassA extends BaseClass {}

import { BaseClass } from './base_class';
export class ClassB extends BaseClass {}
…
import { BaseClass } from 'library';
export class ExtendedBaseClass extends BaseClass {
    oneMethod() {
         const data = BaseClass.prototype.oneMethod.call(this);
         // make additional things with data
         return data;
    }
}

有没有办法让这个新 ExtendedBaseClass 成为所有 ClassX 的父级?至少在它们的新扩展和重新导出版本中不需要复制它们的内部代码。

Is there a way for this new ExtendedBaseClass to become the parent of all ClassXs?

没有

另一种方法可能是直接在基础上替换一个方法 class:

import { BaseClass } from 'library';

const oneMethod = BaseClass.prototype.oneMethod;

Object.defineProperty(BaseClass.prototype, 'oneMethod', {
    value() {
         const data = oneMethod.call(this);
         // make additional things with data
         return data;
    },
});

无法完全按照您的要求进行操作,但您可以通过单独扩展每个 class 来获得相同的结果。

ExtendedClassA extends ClassA {
  oneMethod() {
    // call a shared method if you need to reuse
  }
}

// ExtendedClassB, etc