知识卡片
属性查询走原型链但赋值只作用于自身
内容
查询对象属性时,如果自身没有这个属性,引擎会沿着原型链逐层往上找,直到找到或者走到链的尽头返回undefined。但赋值操作完全不同:给对象设置一个属性时,不管这个属性名是否在原型链上存在,赋值永远只发生在对象自身,要么修改自身已有的同名属性,要么在自身新建一个属性来遮蔽(覆盖)原型链上的同名属性——原型对象本身丝毫不受影响。这个不对称性正是[[原型继承代替类继承的本质]]的运作根基:继承只在”读”的方向上生效,“写”永远是局部的,这才使得多个对象可以安全共享同一个原型而不必担心互相污染。唯一的例外是原型链上存在带setter的存取器属性时,赋值会转而调用这个setter,但setter仍然是以自身对象为this执行的,并不会修改原型链本身。
参考来源
《JavaScript权威指南(原书第6版)》第6章《对象》