对象的Javascript getter和setter,而不是对象属性

时间:2014-08-07 19:14:13

标签: javascript object properties setter getter

我知道如何使用JS getter和setter来处理对象属性,如此

var myObject = {
    value : 0,
    get property() {
        return this.value;
    },
    set property(v) {
        this.value = v;
    }
}

因此调用myObject.property = 2会设置myObject.value,但我想知道的是,是否有某种方法可以调用myObject = 2并仍设置myObject.value而不是myObject将{{1}}从对象更改为数字。

这可能是不可能的,但javascript是一种非常灵活的语言,我认为在我放弃这个想法之前,我已经向社区提出了这个问题。

2 个答案:

答案 0 :(得分:0)

确实可能。仅适用于全局变量。

Object.defineProperties(this, {
    myObject: {
        get: function () {
            return myObjectValue;
        },
        set: function (value) {
            myObjectValue = value;
        },
        enumerable: true,
        configurable: true
    },
    myObjectValue: {
        value: 0,
        enumerable: false,
        configurable: true,
        writable: true
    }
});

myObject = 5;
console.log(myObject);
console.log(delete myObject);

现在,每次为myObject分配值时,它实际上应运行set函数并将值分配给其他属性。现在,如果你想减少污染,你可以创建一个IIFE并在其中使用变量来代替保存这些值。

http://jsbin.com/zopefuvi/1/edit

以下是IIFE的版本。

http://jsbin.com/puzopawa/1/edit

答案 1 :(得分:0)

请注意。在阅读此问题之前,我不知道您可以在没有Object.defineProperty的情况下定义getter / setter。我想知道这种“速记”方法与通过Object.defineProperty定义getter / setter方法之间的区别是什么。

我使用问题中的myObject示例找到了

var myObject = {
    value : 0,
    get property() {
        return this.value;
    },
    set property(v) {
        this.value = v;
    }
}

那个Object.getOwnPropertyDescriptor(myObject, 'property')

返回

get: ƒ property()
set: ƒ property(v)
enumerable: true
configurable: true

值得一提的是,在这种情况下,property是可枚举的,这意味着它将循环显示。