带有defineProperty的Getter / setter

时间:2016-09-06 02:11:03

标签: javascript object properties

我正在尝试为我的对象定义一个getter。但是,我也希望能够指向该setter的属性。

示例对象:

var obj = {
    weight: 14
};

现在我想创建一个扩展此对象的函数,这样当它经典地称为obj.weight时,将返回'14'。但是,我还想选择拨打obj.weight.unit并获得'公斤'作为回报​​。

这就是我试图做的事情:

Object.defineProperty(obj, 'weight', {
    get: function () {
        return obj.weight;
    },
    'unit': 'Kilograms'
});

减轻体重,但减肥单位不起作用。此外,当我尝试在控制台中看到“obj”的上下文时,它只是不显示“unit”,就好像它不存在一样。

2 个答案:

答案 0 :(得分:1)

Bergi是正确的,JS有这些基元的包装器对象。像Number对象一样。对于您的情况,我可能会提出如下解决方案;

var obj = { _weight : 14,
            get weight(){ var n = new Number(this._weight+"");
                          n.unit = "kg";
                          return n;
            },
            set weight(v){ this._weight = v}
          };
console.log(obj.weight); // returns a number object with PrimitiveValue  of _weight property.
console.log(obj.weight.unit); // returns "kg"

// however you can still use obj.weight just like a primitive number in operations.
obj.weight = 40;
console.log(obj.weight / 4)
console.log(obj.weight.unit)

答案 1 :(得分:0)

你可以尝试:

var obj = {
    weight: 14,
    unit: 'km'
};

Object.defineProperty(obj, 'w', {
        get: function() {
            return obj.weight;
        }
    }
);
Object.defineProperty(obj, 'u', {
    get: function() {
        return obj.unit;
    }
});
console.log(obj.w);
console.log(obj.u);

您可以参考文档:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/defineProperty