4

考虑以下代码:

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
});

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

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

所以我的代码没有按预期工作,我想不出任何其他解决方案。因此这个问题。

4

1 回答 1

9

想像这样的重新定义操作:新定义中的每个键替换旧定义中的相应键。set由于在重新定义属性时未指定键,因此它保留其旧值。

您需要明确地包含它undefined才能摆脱它,实际上您根本不需要设置 getter,因为您没有更改它:

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

然后,在我的测试中:

o.y     // 0
o.y = 1
o.y     // 1
o.y = 2
o.y     // 1
于 2014-10-03T05:17:22.217 回答