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
没有影响,但反过来呢?
创建后,当父对象立即更新own
属性时,子shadowed
属性不受影响。
foo.x = 4
console.log(bar.x) // 3
答案 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__
。它是浏览器特定的功能(这就是它在名称中有下划线的原因)。