我需要将延迟评估的getter结果导入JSON。 我对保留方法调用本身并不感兴趣。
我正在开发一个项目,我们有一个广泛的ES6对象树,并且已经使用Mustache库将这些树转换为HTML表示。在整个项目中,当我们需要一个简单的计算字段时,我们已经使用了getter。
class Foo {
get bar() {
return 1 + 2;
}
}
胡子可以将它们称为属性,并且对世界都有好处。
现在我们正在转向我们模板的托管解决方案。但是,这些对象树通过JSON.stringify
发送,以将数据发送到托管服务。在这样做时,这些吸气剂都没有出现。
f = new Foo();
JSON.stringify(f); // == '{}', hoping for '{"bar":3}'
如果我使用__defineGetter__
使用旧的原型继承方式构建这些对象,它就像我需要的那样工作。但这需要我重建所有对象而不是使用漂亮的ES6类。
f = {};
f.__defineGetter__('bar', function() { return 1 + 2;} );
JSON.stringify(f); // == '{"bar":3}' Woot!
所以我一直在尝试在类中渲染这些的不同方法 - 丑陋的暴力方法是将它们全部重写为对象属性,并在内容更改时重新更新它们。有更优雅的方式吗?
我正在考虑为这些对象添加一个toJSON
方法来生成相应的数据,但我似乎无法动态检索getter列表。
class Foo {
get bar() {
return 1 + 2;
}
toJSON() {
return JSON.stringify(Object.assign({}, this));
}
}
然而Object.assign
也忽略了getter并且没有解决问题。我不得不求助于获取和存储每个值。
toJSON() {
let result = Object.assign({}, this);
result.bar = this.bar;
return JSON.stringify(result);
}
但是现在我必须维护这些getter的单独列表,这将容易出错。 (当开发者添加一个getter时,他们必须记住将它添加到列表中,否则它将神秘地显示在模板中。)
要明确,我对序列化方法不感兴趣,我需要将延迟计算的结果显示在JSON中,就像它对弃用的__defineGetter__
完全一样Mustache正在处理它的方式。
有什么想法吗?