对象的Javascript获取程序和设置程序,而不是对象属性

对象的Javascript获取程序和设置程序,而不是对象属性,javascript,object,properties,setter,getter,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并仍然设置myO

我知道如何对对象属性使用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
从一个对象更改为一个数字


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

这确实是可能的。但仅适用于全局变量

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,并在其中使用变量来保存这些值

这是关于生活的版本


作为旁注。直到读到这个问题,我才知道可以定义getter/setter,而不需要
Object.defineProperty
。我想知道这种“速记”方法与通过
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

所以值得一提的是,在本例中,
属性
是可枚举的,这意味着它将显示在循环中。

放弃这个想法
myObject
是一个引用,将其重新分配给其他对象将。。。好吧,将其重新分配给其他对象。在JavaScript中,这是不可能的,尽管在规范中指定了一个
DefineOwnProperty
方法,该方法仅在为函数创建参数时使用。你能得到的最接近的东西是在
窗口
上使用
DefineProperty
。我想你真正想要的是重载赋值运算符,它是@DaveNewton,你可以定义getter和setter,这样在分配引用时,它只执行setter函数,而不实际为该属性赋值。@Derek朕會功夫 这与将任意引用设置为您要设置的对象以外的对象非常不同。或者更确切地说,它不同于让赋值操作符执行赋值以外的操作。这是烘焙到语言中的。OP询问的是变量,而不是全局对象的属性。请解释这是如何工作的,并弄清楚什么会被污染。@Bergi,变量确实是全局对象的属性,不是吗?当然,这只适用于全局变量。IIFE的第二个把戏是最小化对全局对象上一个属性的污染,这与简单地创建一个全局变量是一样的。是的,但是只有全局变量才是,并且你不想在一般情况下使用它们,所以这个解决方案不适用于任意变量。是的。我同意。让我补充一点。谢谢。不幸的是,我想使用它的情况不是全球性的,但因为这回答了问题,我将标记为已接受。