我试图向同事解释原型继承的罕见用例,当时我感到难以理解这不会像我期望的那样工作。
const baseobj = { baseproperty: 'original'};
const x = Object.create(baseobj);
//should add properties to x, not the base
x.newproperty = 'bar';
console.assert(x.newproperty != baseobj.newproperty);
//so far so good
//should modify the base, not x
x.baseproperty = 'foo';
console.assert(x.baseproperty == baseobj.baseproperty);
//this assert failed, property is on x!?
我很困惑。据我所知,分配是一个两步过程,一个用于查找属性,另一个用于分配属性。那么为什么查找baseproperty
不返回(并因此修改)baseobj.baseproperty
?
我知道这样的东西这对于angularjs范围的工作方式至关重要,但具体发生在这里的是我。
答案 0 :(得分:2)
分配给对象实例上的属性总是创建一个"拥有的"目标对象上的属性(如果当然不存在)。即使存在与名称匹配的原型链属性,原型属性也不会受到此类赋值的影响。
当然,在任务完成后,"拥有"对象上的属性隐藏了原型链属性。