在将属性分配给JavaScript中的对象之前验证和/或预处理属性的最佳做法是什么?
该应用程序的目的是创建一个对象,并保证它的特定属性始终具有特定类型,或者可以对其进行一些预处理。
例如,如果我创建一个对象:
var obj = {
settings: {}
};
然后我做的事情如下:
obj.settings = "{foo: bar}";
它会自动检查赋值的类型 - 如果它是一个字符串,它会尝试将它解析为一个对象;如果它是一个对象,它只会分配它;否则会抛出错误。这样可以保护对象的属性不被分配给“任何东西”。
另外,这在JavaScript中是否有意义,或者我只是尝试使用弱类型语言的强类型功能?
答案 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)
但是,如果这是可取的,取决于您的具体用例。我坦率地说到目前为止从未使用它。我的建议是:不要花哨:)
恕我直言,这不是强打字,但相反,因为你更有活力。如果您想要强打字,可以尝试flow或TypeScript
答案 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}";
让我知道这是否有意义。