如何从JavaScript对象中删除setter?

5

Consider the following code:

var x = 0;

var o = {};

function getter() {
    return x;
}

Object.defineProperty(o, "y", {
    get: getter,
    set: function (y) {
        x = y;

        Object.defineProperty(o, "y", {
            get: getter
        });
    },
    configurable: true
});

我的目标是去掉setter,并在setter被调用一次后使属性o.y不可配置。但是它并没有按照预期工作:

> x       // 0
> o.y     // 0
> o.y = 1 // 1
> x       // 1
> o.y     // 1
> o.y = 2 // 2
> x       // 2
> o.y     // 2

因此,我的代码没有按预期工作,我无法想出其他解决方案。因此提出此问题。
1个回答

10

将重新定义操作理解为:新定义中的每个键都会替换旧定义中相应的键。由于重新定义属性时未指定set键,因此它保留其旧值。

如果要去除它,您需要明确将其包含为undefined,实际上您根本不需要设置getter,因为您并没有更改它:

Object.defineProperty(o, "y", {
    set: undefined
});

接下来,在我的测试中:

o.y     // 0
o.y = 1
o.y     // 1
o.y = 2
o.y     // 1

我认为这就是使所有内部React对象(例如nextProps)不可修改的技巧。 - Marco Faustinelli
@MarcoFaustinelli 把文档放在 https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/defineProperty -- 这里有一个“writable”属性。 - Dexygen

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