在JavaScript中,可以绕过setter吗?

时间:2018-12-16 07:09:05

标签: javascript prototype getter-setter

我有一个对象o,原型为p

var p = {}
var o = Object.create(p)

可以向对象a添加属性o,然后向原型p添加同名的setter:

o.a = 1
Object.defineProperty(p, 'a', {set: function(value) {}});

console.log(o.a);  // 1

但是,如果我们尝试在设置器后添加 属性,则不会将其添加到o中,而是调用设置器:

Object.defineProperty(p, 'a', {set: function(value) {}});
o.a = 1

console.log(o.a);  // undefined

是否可以先定义设置器,然后绕开它以将属性a直接添加到o

1 个答案:

答案 0 :(得分:4)

您可以再次使用defineProperty并将writable设置为true。您可能还需要设置enumerableconfigurable,因为它们默认为false。您无需将value设置为默认值undefined,但是我认为这样做更加清楚。

var p = {}
var o = Object.create(p)
Object.defineProperty(p, 'a', {set: function(value) {console.log("value:", value)}})

o.a = "test" // logs "value: test"

// override setter
Object.defineProperty(o, 'a', {value:undefined, writable:true, enumerable:true, configurable:true})

console.log(o.a);  // undefined

o.a = 1
console.log(o.a);  // 1
console.log(Object.keys(o))