在JavaScript中,是否可以绕过一个setter?
In JavaScript, is it possible to bypass a setter?
我有一个对象 o
,其原型为 p
:
var p = {}
var o = Object.create(p)
可以在对象o
中添加一个属性a
,然后在原型[=16=中添加一个同名的setter ]:
o.a = 1
Object.defineProperty(p, 'a', {set: function(value) {}});
console.log(o.a); // 1
但是,如果我们尝试在 之后添加 属性 setter,它不会添加到 o
- setter 改为调用:
Object.defineProperty(p, 'a', {set: function(value) {}});
o.a = 1
console.log(o.a); // undefined
是否可以先定义 setter,然后绕过它直接将 属性 a
添加到 o
?
您可以再次使用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))
我有一个对象 o
,其原型为 p
:
var p = {}
var o = Object.create(p)
可以在对象o
中添加一个属性a
,然后在原型[=16=中添加一个同名的setter ]:
o.a = 1
Object.defineProperty(p, 'a', {set: function(value) {}});
console.log(o.a); // 1
但是,如果我们尝试在 之后添加 属性 setter,它不会添加到 o
- setter 改为调用:
Object.defineProperty(p, 'a', {set: function(value) {}});
o.a = 1
console.log(o.a); // undefined
是否可以先定义 setter,然后绕过它直接将 属性 a
添加到 o
?
您可以再次使用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))