是否可以从继承的工厂方法中一般实例化 JS class 类型?

Is it possible to generically instantiate a JS class type from an inherited factory method?

所以我已经在谷歌上搜索了几个小时了,但我真的不能确定它是否可行。我不太了解 JS 继承,无法找到解决方案。我正在使用 TypeScript,但我认为这是一个 JavaScript 问题。平台是 Node.js.

我的设置如下:

class Message {
    static fromBytes(bytes) {
        someChecks();
        return new Message(processedBytes);
    }
    constructor(someParameters) {
        someOtherChecks();
    }
}

class SpecificMessage extends Message {
    constructor(parameters) {
        someSpecificChecks(parameters);
    }
}

背景是我得到了一些字节的网络流量,在解码之前必须检查一致性。 classes 还用于准备新的传出字节(有一个 toBytes 方法),这就是为什么在 fromBytes 中检查校验和一致性并在构造函数中检查逻辑一致性的原因。

我想要的是一个可继承的工厂方法,它将 return 各自的对象类型。调用 SpecificMessage.fromBytes 将 return 一个 Message 对象,因为它已明确命名。无论我是从 Message 还是 SpecificMessage 调用,我都想用 "knows" 的内容替换该对象创建。我在那个方向上的最佳猜测是 Object.create(this.prototype, {someInitLiteral}),但我认为这不会调用构造函数?

另一件事是 Object.call(this, parameters),但我认为这也不正确。有没有办法从 "generic" 静态方法实例化当前 class?

最坏的情况我正在考虑只调用 super.fromBytes 并从包含的数据创建一个新的 SpecificMessage。这将构造两个对象,但要通过所有检查。

感谢您的帮助。

您似乎已经意识到,this keyword 将引用静态方法1 中的构造函数(= (sub)class) .所以你可以用 new:

来调用它
class Message {
    static fromBytes(bytes) {
        someChecks();
        return new this(processedBytes);
//             ^^^^^^^^
    }
    constructor(someParameters) {
        // …
    }
}

1:只要在各自class上作为方法调用即可。您不能再轻松地将它传递给 as a callback.