在JavaScript中,是否可以绕过setter?

use*_*783 7 javascript prototype getter-setter

我有一个o原型对象p:

var p = {}
var o = Object.create(p)
Run Code Online (Sandbox Code Playgroud)

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

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

console.log(o.a);  // 1
Run Code Online (Sandbox Code Playgroud)

但是,如果我们尝试在setter 之后添加属性,则不会将其添加到o- 而是调用setter:

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

console.log(o.a);  // undefined
Run Code Online (Sandbox Code Playgroud)

是否可以先定义setter,然后绕过它以a直接添加属性o

Mar*_*yer 5

您可以defineProperty再次使用并设置writabletrue。您可能还想设置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))
Run Code Online (Sandbox Code Playgroud)