Object 原型上设置了get和set,Object自身属性和原型属性被绑定?

observer-util库 的时候发现了一个测试用例,类似下面这样的。

因为原型上定义了prop的 get 和 set 方法,在修改 obj.prop的时候,原型对象的 prop 也发生了同步变化,而且obj 自己本身并没有增加prop属性。

这是为什么呢?

let hiddenValue
const obj = {}
const parent = {
  set prop (value) {
    hiddenValue = value
  },
  get prop () {
    return hiddenValue
  }
}
Object.setPrototypeOf(obj, parent)

obj.prop = 2
console.log(parent.prop) // 2
parent.prop = 4
console.log(obj.prop) // 4

补充一下,假如没有设置原型的访问器属性,则不会发生上面的变化

let hiddenValue
const obj = {}
const parent = {}
Object.setPrototypeOf(obj, parent)

obj.prop = 2
console.log(parent.prop) // undefined
parent.prop = 4
console.log(obj.prop) // 2
阅读 2.3k
3 个回答

提出假设: 因为obj上没有prop属性, 在给 prop 赋值时,js解释器沿着原型链寻找,执行 parent的set方法。而 我们定义的 set 方法,根本没有在 obj 上创建prop 属性。所以造成了 obj.prop 和 parent.prop 属性同步的现象。

验证假设: 使用 Object.kyes(obj) 发现没有prop 这个key,代表 obj 自身没有这个属性。

查阅 ECMAScript 文档

image.png

应该是调用了setter,前面的判断逻辑我觉得是不合符的。。

ECMAScript 中文

ECMAScript 英文

正是因为 obj 自己本身并没有增加 prop 属性,所以 obj.prop 会通过原型链向下查找,那么实际调用的是原型上的 prop,所以 parent.prop 就被改变了。

因为obj的原型是parent。所以在设置obj.prop的时候,因为obj没有prop就往原型链上查找到parent.prop,所以修改的是parent

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题