Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to remove the setter from a JavaScript object?

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

My objective is to remove the setter and make the property o.y non-configurable after the setter has been called once. However it doesn't work as expected:

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

So my code did not work as expected, and I can't think of any other solution. Hence this question.

like image 331
Aadit M Shah Avatar asked Jan 09 '23 16:01

Aadit M Shah


1 Answers

Think of the redefine operation like this: each key in the new definition replaces the corresponding key in the old definition. Since you do not specify a set key when you redefine the property, it retains its old value.

You need to explicitly include it as undefined in order to get rid of it, and in fact you don't need to set the getter at all because you are not changing it:

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

Then, in my tests:

o.y     // 0
o.y = 1
o.y     // 1
o.y = 2
o.y     // 1
like image 93
cdhowie Avatar answered Jan 12 '23 07:01

cdhowie