我有一个对象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
?
答案 0 :(得分:4)
您可以再次使用defineProperty
并将writable
设置为true
。您可能还需要设置enumerable
和configurable
,因为它们默认为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))