更新继承的属性

时间:2014-12-21 23:47:43

标签: javascript

var foo = {x: 1}
var bar = {__proto__: foo} // __proto__ specific to implementation
var bar = Object.create(foo) // same result as above with standard API 
console.log(bar.x) // 1
foo.x = 2
console.log(bar.x) // 2
bar.x = 3
console.log(foo.x) // 2

为什么子对象inherited更新x属性bar对父对象foo没有影响,但反过来呢?

@EDIT

创建后,当父对象立即更新own属性时,子shadowed属性不受影响。

foo.x = 4
console.log(bar.x) // 3

2 个答案:

答案 0 :(得分:4)

分配给对象属性会创建或更新对象自己的属性, prototype 链上没有搜索继承属性。

请参阅ECMAScript Simple Assignment ( = ) §11.13.1

答案 1 :(得分:3)

这都是关于原型的。 bar对象没有x属性,因此当您尝试访问它时,将涉及原型链,您将获得foo.x的值。然后,您更新foo.x,在访问bar.x时,您还会看到另一个值。

但是当您设置bar.x时,将在x对象中创建bar属性。 foo.x是另一个,所以它将保持不变。

您应避免在代码中使用__proto__。它是浏览器特定的功能(这就是它在名称中有下划线的原因)。