在将其分配给JavaScript中的对象之前验证/预处理属性

时间:2018-06-05 11:14:57

标签: javascript object javascript-objects

在将属性分配给JavaScript中的对象之前验证和/或预处理属性的最佳做法是什么?

该应用程序的目的是创建一个对象,并保证它的特定属性始终具有特定类型,或者可以对其进行一些预处理。

例如,如果我创建一个对象:

var obj = {
    settings: {}
};

然后我做的事情如下:

obj.settings = "{foo: bar}";

它会自动检查赋值的类型 - 如果它是一个字符串,它会尝试将它解析为一个对象;如果它是一个对象,它只会分配它;否则会抛出错误。这样可以保护对象的属性不被分配给“任何东西”。

另外,这在JavaScript中是否有意义,或者我只是尝试使用弱类型语言的强类型功能?

2 个答案:

答案 0 :(得分:2)

您可以使用Object.defineProperty执行此操作:

var obj = {}
Object.defineProperty(obj, 'settings', {
  set: function (x) {
    if (typeof x === 'string') {
      this._settings = JSON.parse(x)
    } else {
      this._settings = x
    }
  },
  get: function () {
    return this._settings
  }
})

obj.settings = {foo: 'bar'}
console.log(obj.settings)
obj.settings = '{foo: "baz"}'
console.log(obj.settings)

但是,如果这是可取的,取决于您的具体用例。我坦率地说到目前为止从未使用它。我的建议是:不要花哨:)

恕我直言,这不是强打字,但相反,因为你更有活力。如果您想要强打字,可以尝试flowTypeScript

答案 1 :(得分:0)

一个简单的解决方案可能是使用下面的getter / setter,如果为属性分配了值以及如何处理它,则会触发它:

let obj = {}
Object.defineProperty(obj, "settings", {
 set: function (value) { // preprocess
    this._value = value;
 },
 get: function () {
    return "changed";
}
});

之后你可以这样做:

    obj.settings = "{foo: bar}";

让我知道这是否有意义。

参考: MDN Reference: Object.defineProperty()