在不调用构造函数的情况下实例化javascript类

时间:2018-06-05 17:21:44

标签: javascript class

简短版

鉴于以下课程:

class Foo {
    constructor() {
        throw new Error("No!")
    }

    // ... more functions ...
}

如何获得Foo的实例?

解释

实际上看起来更像这样:

const KEY = Symbol("BAR")
function validateBarData(input) { 
    /* throws error if input is not in the format: */
    /* {name: "string", bartender: "string", drinks: [ "string" ]} */
}
class Bar {
    constructor(name, bartender, drinks) {
        this[KEY] = {name: name, bartender: bartender, drinks: drinks}
        // now validate to protect against garbage input like
        //   'name = 42' or 'drinks = undefined', etc.
        validateBarData(this[KEY])
    }

    encode() {
        return this[KEY]
    }

    static decode(data) {
        validateBarData(data)
        return new Bar(data.name, data.bartender, data.drinks)
    }

    // ... more functions ...
}

encode()Bar.decode(data)用于将状态序列化为JSON.stringify,以便稍后可以重新创建对象。这里的实际编码/解码逻辑可能比仅仅转储this[KEY]'更复杂。 (例如,编码由Bar对象管理的对象)。

解码时的问题:

  • validateBarData被叫两次
  • 虽然在this[KEY]的第一行之后我们已经有一个有效的内部状态要分配给decode,但首先必须对其进行解构,然后重新创建。

我希望避免这种重复,但我找不到正确的方法。

我该怎么办呢?

1 个答案:

答案 0 :(得分:1)

糟糕。

let foo = Object.create(Foo.prototype)

static decode(data) {
    validateBarData(data)
    let bar = Object.create(Bar.prototype)
    bar[KEY] = data
    return bar
}

在发布问题之前我已经尝试了最后一件事,事实证明我应该在原型上调用Object.create,而不是类本身。多么尴尬......

我还是张贴了,因为问题标题中的关键字没有显示在搜索结果中(在撰写本文时;很多关于java,但不是javascript),所以也许这将节省别人的时间。