JS原型

来自《你不知道的JavaScript》第5章原型的学习总结

《=======================================================================》

所有普通的[[Prototype]]链最终都会指向内置的Object.prototype。由于所有的"普通"(内置,不是特定主机的扩展)都“源于”

(或者说把[[Prototype]]链的顶端设置为Object.prototype对象),所以他包含JS中许多通用的功能。

1.属性设置和屏蔽

myObject.a="hello";

1.1如果myObject对象包含名为a的普通数据访问属性,这条赋值语句只会修改已有的属性。

1.2如果a不存在于myObject中,[[prototype]]链就会被遍历,类似[[GET]]操作。如果原型链找不到a,a就会被直接添加到myObject上。

1.3如果a存在于原型链上层,又出现在myObject中,那么myObject包含的a属性会屏蔽原型链上层的所有a属性,因为myObject.a总会选择原型链中最底层的a属性。

1.4如果a存在于原型链上层,不存在与myObject中,那么:

  • 如果原型链上层存在a的普通数据访问属性,并且没有被标记为writable:false,则会直接在myObject中添加一个名为a的新属性,它是屏蔽属性。
  • 如果原型链上层存在a的普通数据访问属性,并且被标记为writable:false,那么无法修改已有属性或者在myObject上创建屏蔽属性(模拟类属性的继承)。如果在严格模式下,代码会报错。否则,该赋值语句会被忽略。总之,不会发生屏蔽。
  • 如果原型链上层存在a的普通数据访问属性,并且它是一个setter,那就一定会调用这个setter.a不会被添加到myObject,也不会重新定义a这个setter.

猜你喜欢

转载自blog.csdn.net/gzkahjl/article/details/82831068