实例化javascript类而不调用构造函数

实例化javascript类而不调用构造函数,javascript,class,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:

短版

鉴于以下类别:

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()。这里的实际编码/解码逻辑可能比“dump
this[KEY]
”更复杂(例如,由
条管理的编码对象)

解码时出现的问题:

  • validateBarData
    被调用两次
  • 虽然在
    解码
    的第一行之后,我们已经有了一个有效的内部状态来分配给
    这个[KEY]
    ,但必须先对它进行解构,然后重新创建它
我想避免这种重复,但我还没有找到正确的方法

我该怎么做呢?

哎呀

let foo = Object.create(Foo.prototype)

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

我之所以发帖,是因为问题标题中的关键词没有出现在搜索结果中(在撰写本文时,很多都是关于java的,但不是javascript),所以这可能会在将来为其他人节省时间

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