如何从JavaScript对象中删除setter?

如何从JavaScript对象中删除setter?,javascript,setter,getter,getter-setter,defineproperty,Javascript,Setter,Getter,Getter Setter,Defineproperty,考虑以下代码: 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 }); }, conf

考虑以下代码:

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

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

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

您需要显式地将其包含为
未定义的
,以除去它,事实上,您根本不需要设置getter,因为您没有更改它:

Object.defineProperty(o, "y", {
    set: undefined
});
然后,在我的测试中:

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

我认为这是一个使所有类型的内部React对象(例如,
nextProps
)都不可修改的技巧。@MarcoFaustinelli将文档设置为--有一个“可写”属性