带有/ getter和setter的javascript对象

时间:2014-12-08 16:38:55

标签: javascript object definition getter-setter defineproperty

我正在创建一个对象定义来封装几个属性。我对此对象有4个要求:

  • 可以随时创建多个实例
  • 只能在对象中定义属性/ get
  • 对象必须是stringify-able(只是属性和关联值)
  • 字符串化版本必须可解析并返回对象

这是我到目前为止的简化版本:

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;
    }
    ...
}

同样,这是满足所有要求的最佳方法吗?

1 个答案:

答案 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);

}

相关问题