不应该分配给原型属性在原型上覆盖它吗?

时间:2017-02-03 23:12:45

标签: javascript prototype

我试图向同事解释原型继承的罕见用例,当时我感到难以理解这不会像我期望的那样工作。

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范围的工作方式至关重要,但具体发生在这里的是我。

1 个答案:

答案 0 :(得分:2)

分配给对象实例上的属性总是创建一个"拥有的"目标对象上的属性(如果当然不存在)。即使存在与名称匹配的原型链属性,原型属性也不会受到此类赋值的影响。

当然,在任务完成后,"拥有"对象上的属性隐藏了原型链属性。