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

6

我知道如何使用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是一种非常灵活的语言,我想在放弃这个想法之前向社区提出这个问题。

1
放弃这个想法。myObject是一个引用,将其重新赋值给其他东西会...好吧,就是将其重新赋值给其他东西。 - Dave Newton
在JavaScript中似乎不可能,尽管规范中有一个DefineOwnProperty方法,但只用于创建函数参数时。你能得到的最接近的东西是在window上使用DefineProperty - Derek 朕會功夫
3
我认为你真正想要的是重载赋值运算符,这个话题之前已经有人讨论过了(http://stackoverflow.com/questions/3770480/is-there-a-way-to-customize-override-assignment-operations-in-javasscript)。 - Don
@DaveNewton,你可以定义getter和setter,这样当引用被赋值时,它只执行setter函数而不是实际分配该属性的值。 - Derek 朕會功夫
@Derek朕会功夫 这与将任意引用设置为与所设置的内容不同的内容非常不同。或者说,这与使赋值运算符执行除分配之外的其他操作不同。这是编程语言的基础。 - Dave Newton
糟糕。我误以为这是属性描述符的错误用法,因此我对这个问题进行了负投票。我不知道您可以直接使用getter/setter定义属性。现在我的投票被锁定了。非常抱歉! - Zach Smith
2个回答

3

确实是可能的。不过只适用于全局变量。

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


OP询问的是变量,而不是全局对象的属性。请解释这是如何工作的,并明确哪些会被污染。 - Bergi
@Bergi,变量确实是全局对象的属性,不是吗?是的,这仅适用于全局变量。第二个使用IIFE的小提琴将污染最小化为全局对象上的一个属性,这与简单创建全局变量相同。 - Siddharth
1
是的,但 只有 全局变量是如此,而一般情况下您不希望使用它们,因此此解决方案对于任意变量都不起作用。 - Bergi
正确。我同意。让我补充一下。谢谢。 - Siddharth
2
不幸的是,我想要使用它的情况并不是全局的,但既然这回答了问题,我会将其标记为已接受。 - wackozacko

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是可枚举的,这意味着它将在循环中显示出来。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接