2

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

  • 任何时候都可以创建多个实例
  • 只能设置/获取对象上定义的属性
  • 该对象必须是可字符串化的(只是属性和关联值)
  • 字符串化版本必须是可解析的并返回对象

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

function Car() {
    
    var _make;

    Object.defineProperty(this, 'make', {
        get: function() {
            return _make;
        },
        set: function(make) {
            _make = make;           
        }
    });
    Object.preventExtensions(this);
}

我不确定这是否是使用 getter 和 setter 定义对象的最简单方法。有没有使用的替代方法Object.defineProperty,或者这是新规范?

这种方法还需要我编写自己的stringify方法(见下文),因为调用JSON.stringify将剥离函数,而这将剥离make. 有没有写我自己的替代方法?我可以以某种方式更改我的对象定义吗?

Car.prototype.stringify = function () {
    return JSON.stringify({ make: this.make});
}

此外,我必须提供一个可选的构造函数 arg 才能Car从 JSON 对象实例化 a:

function Car(car) {
    var _make;
    if(car !== undefined && car != null) {
        _make = car.make;
    }
    ...
}

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

4

1 回答 1

4

要在使用 时显示make属性JSON.stringify,您必须将 设置enumerableTrue(默认情况下为False)。

可配置true当且仅当此属性描述符的类型可以更改并且可以从相应对象中删除该属性时。默认为false.

enumerabletrue当且仅当此属性在枚举相应对象的属性期间出现。默认为false. 功能汽车(){

var _make;

Object.defineProperty(this, 'make', {
    get: function() {
        return _make;
    },
    set: function(make) {
        _make = make;           
    },
    enumerable:true 
});
Object.preventExtensions(this);

}

于 2016-11-08T07:45:49.523 回答