首页 > 解决方案 > 在 JavaScript 中,是否可以绕过 setter?

问题描述

我有一个o带有原型的对象p

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

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

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

标签: javascriptprototypegetter-setter

解决方案


您可以defineProperty再次使用并设置writabletrue. 您可能还想设置enumerableandconfigurable因为它们默认为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))


推荐阅读