当一个原型对象被定义时,那么它具有相同的属性的 hasOwnProperty 将是错误的,为什么?



代码如下:

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);

最新更新