В JavaScript возможно ли обойти сеттер? - PullRequest
0 голосов
/ 16 декабря 2018

У меня есть объект o с прототипом p:

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

Можно добавить свойство a к объекту o, а затем добавить установщик того же самогоимя для прототипа p:

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 голосов
/ 16 декабря 2018

Вы можете снова использовать 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))
...