简短版
鉴于以下课程:
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
,但首先必须对其进行解构,然后重新创建。我希望避免这种重复,但我找不到正确的方法。
我该怎么办呢?
答案 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),所以也许这将节省别人的时间。