看 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
提出假设: 因为obj上没有prop属性, 在给 prop 赋值时,js解释器沿着原型链寻找,执行 parent的set方法。而 我们定义的 set 方法,根本没有在 obj 上创建prop 属性。所以造成了 obj.prop 和 parent.prop 属性同步的现象。
验证假设: 使用 Object.kyes(obj) 发现没有prop 这个key,代表 obj 自身没有这个属性。
查阅 ECMAScript 文档
应该是调用了setter,前面的判断逻辑我觉得是不合符的。。
ECMAScript 中文
ECMAScript 英文