如何将类getter的结果转换为JSON?

时间:2016-10-25 20:59:56

标签: node.js

我需要将延迟评估的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正在处理它的方式。

有什么想法吗?

0 个答案:

没有答案