我正在创建一个对象定义来封装几个属性。我对此对象有4个要求:
这是我到目前为止的简化版本:
function Car() {
var _make;
Object.defineProperty(this, 'make', {
get: function() {
return _make;
},
set: function(make) {
_make = make;
}
});
Object.preventExtensions(this);
}
我不确定这是否是使用getter和setter定义对象的最简单方法。是否有使用defineProperty的替代方法,或者这是新规范吗?
这种方法还要求我编写自己的stringify方法(见下文),因为调用JSON.stringify会剥离函数,这将剥离make
。有写自己的替代方案吗?我可以以某种方式更改我的对象定义吗?
Car.prototype.stringify = function () {
return JSON.stringify({ make: this.make});
}
此外,我必须提供一个可选的构造函数arg,以便能够从JSON对象实例化Car:
function Car(car) {
var _make;
if(car !== undefined && car != null) {
_make = car.make;
}
...
}
同样,这是满足所有要求的最佳方法吗?
答案 0 :(得分:4)
要在使用make
时显示JSON.stringify
属性,您必须将enumerable
设置为 True (默认情况下, False )。
可配置:
true
当且仅当此属性描述符的类型可能更改且属性可能从相应对象中删除时。 默认为false
。可枚举:
true
当且仅当在枚举相应对象的属性期间显示此属性时。 默认为false
。 功能车(){
var _make;
Object.defineProperty(this, 'make', {
get: function() {
return _make;
},
set: function(make) {
_make = make;
},
enumerable:true
});
Object.preventExtensions(this);
}