javascript - 带有 getter/setter 的 JSON stringify ES6 类属性

标签 javascript ecmascript-6 stringify es6-class

我有一个 JavaScript ES6 类,该类具有使用 set 设置的属性并使用 get 函数访问。它也是一个构造函数参数,因此可以使用所述属性实例化该类。

class MyClass {
  constructor(property) {
    this.property = property
  }

  set property(prop) {
  // Some validation etc.
  this._property = prop
  }

  get property() {
    return this._property
  }
}

我使用 _property 来避免使用 get/set 的 JS 陷阱,如果我直接设置为 property 会导致无限循环。

现在我需要将 MyClass 的一个实例字符串化,以便通过 HTTP 请求发送它。字符串化的 JSON 是一个像这样的对象:

{
   //...
   _property:
}

我需要生成的 JSON 字符串来保留 property,以便我发送它的服务可以正确解析它。我还需要 property 保留在构造函数中,因为我需要从服务发送的 JSON 构造 MyClass 的实例(它发送的对象带有 property 而不是 _property)。

我该如何解决这个问题?我是否应该在将 MyClass 实例发送到 HTTP 请求之前拦截它并使用正则表达式将 _property 变异为 property ?这看起来很难看,但我将能够保留我当前的代码。

或者,我可以拦截从服务发送到客户端的 JSON,并使用完全不同的属性名称实例化 MyClass。然而,这意味着服务两边的类的不同表示。

最佳答案

您可以使用 toJSON method自定义类序列化为 JSON 的方式:

class MyClass {
  constructor(property) {
    this.property = property
  }

  set property(prop) {
  // Some validation etc.
  this._property = prop
  }

  get property() {
    return this._property
  }

  toJSON() {
    return {
      property: this.property
    }
  }
}

关于javascript - 带有 getter/setter 的 JSON stringify ES6 类属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42107492/

相关文章:

javascript - Instagram API 用于过滤基于标签的图像

javascript - 为什么我的 JavaScript 音频自动播放不起作用?

javascript - 如何在同一声明中使用具有必需属性的多种类型?

json - Aurelia aurelia-fetch-client 和 JSON POST

javascript - RegExp的序列化

javascript - 使用正则表达式将 JS 中的大字符串文字解析为对象数组

javascript - 从浏览器启动应用程序

javascript - 将 javascript 字符串化字符串转换为 java 字符串

javascript - ES6 胖箭头 react this.setState ESLint 错误

node.js - Babel 将异步到模块方法转换为带有 ES6 映射的 Bluebird