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

标签 javascript prototype getter-setter

我有一个对象o,其原型(prototype)为p:

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

可以给对象o添加一个属性a,然后给原型(prototype)p添加一个同名的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。您可能还想设置 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))

关于javascript - 在 JavaScript 中,是否可以绕过 setter?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53800144/

相关文章:

javascript - 用于创建离散和三 Angular 分布的 JS 模拟框架

javascript - 如何在父容器中自动拉伸(stretch)并约束 HTML 子元素?

javascript - ES6 Javascript 类 - 为现有函数定义类方法

Javascript:使用性能参数对函数进行原型(prototype)设计

java - 如何在我的代码行中正确设置totalSeconds()(小时分钟秒)并返回它

c++ - setField() 中的类更改未保留

javascript - 意外使用 'self' no-restricted-globals React

javascript - Dojo:我可以将两个或更多小部件添加到同一个 BorderContainer 区域吗?

javascript - JS中类方法与className.prototype方法的区别

java - 在类中使用 getter/setter