Updating inherited property

こ雲淡風輕ζ 提交于 2019-12-20 02:40:11

问题


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

Why did updating the inherited property x by the child object bar take no effect on the parent object foo but the opposite do?

@EDIT

After its creation the child own property remains unaffected when the parent object updates the shadowed property now.

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

回答1:


Assigning to an object property creates or updates the object's own property, there is no search on the prototype chain for an inherited property.

See ECMAScript Simple Assignment ( = ) §11.13.1.




回答2:


It's all about prototypes. bar object has no x property, so when you try to access it, prototypes chain will be involved, and you will get value of foo.x. Then you update foo.x, and while accessing bar.x you will see another value also.

But when you set bar.x, x property will be created in bar object. foo.x is another one so it will stay the same.

And you should avoid using __proto__ in your code. It's browser specific feature (that's why it has underscores in name).



来源:https://stackoverflow.com/questions/27594996/updating-inherited-property

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!