代码如下:
function def(obj, key) {
var val = obj[key];
Object.defineProperty(obj, key, {
enumerable: true,
configurable: true,
get: function reactiveGetter() {
return val
},
set: function reactiveSetter(newVal) {
val = newVal;
}
})
}
var AA = Object.create({});
AA.a = 1;
def(AA, "a")
var BB = Object.create(AA);
BB.a= 3;
BB.hasOwnProperty("a") == false // why ?
谢谢
与数据属性不同,如果对象的原型链中有一个带有setter的访问器属性,则会调用该setter(在该对象的上下文中(,而不是在对象本身上创建新属性。
换句话说,BB.a = 3
调用AA.a
的setter,它不创建属性BB.a
。
规范的相关部分是第9.1.9.2节OrdinarySetWithOwnDescriptor。
演示:
var AA = {
set a(value) {
console.log('AA', 'value:', value, 'this:', this === AA ? 'AA': 'BB');
}
}
AA.a = 21;
var BB = Object.create(AA);
BB.a = 42;
console.log(BB.a);