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

时间:2019-01-30 18:24:38

标签: javascript typescript inheritance static-methods

所以我已经搜索了几个小时,但我无法真正确定是否可行。我不太了解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);
    }
}

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

我想拥有一个可继承的工厂方法,该方法将返回相应的对象类型。调用SpecificMessage.fromBytes将返回一个Message对象,因为它已被明确命名。我想用“知道”我是从Message还是SpecificMessage进行调用的对象来代替对象创建。我朝这个方向的最佳猜测是类似Object.create(this.prototype, {someInitLiteral})的东西,但是我认为这不叫构造函数吗?

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

最坏的情况下,我正在考虑仅调用super.fromBytes并根据所包含的数据创建一个新的SpecificMessage。这样可以构造两个对象,但要经过所有检查。

感谢您的帮助。

1 个答案:

答案 0 :(得分:2)

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

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

<子> 1:只要它被称为在相应的类中的方法。可以不再容易地穿过它围绕as a callback

相关问题