程序员

JS中给一个对象属性赋值发什么了?

2017-08-26  本文已影响344人  peppermint_egg

给一个对象设置属性并不仅仅是添加一个新属性或者修改已有的属性值,今天完整的讲讲这个过程

myObject.name=“小河神”

第一种情况,如果myObject这个对象中包含名为name的的普通数据访问属性,这条赋值语句只会修改已有的属性值。

第二种情况,如果name不是直接在myObject中,[[Prototype]]链就会被遍历,类似[[Get]]操作。如果原型链上找不到name,name就会被直接添加到myObject上。

第三种情况,如果name存在于原型链上层,那么情况就比较复杂了。

如果属性名name即出现在myObject中也出现在myObject的原型链上层,那么就会出现屏蔽,myObject中包含的name属性会屏蔽原型链上层额所有name属性,因为myObject.name总是会选择原型链中最底层的name属性。

接下来我们分析一下如果name不直接存在于myObject中而是存在于原型链上层时myObject.name='小河神'会出现的三种情况。

①如果在原型链上层存在名为name的普通数据访问属性并且没有标记为只读(writable:false),那就会直接在myObject中添加一个名为name的新属性,它是屏蔽属性。

②如果在原型链上层存在name,但是他被标记为只读,那么无法修改已有属性,或者在myObject中创建屏蔽属性。如果运行在严格模式下,代码会抛出一个错误,否则,这条赋值语句会被忽略,总之,不会发生屏蔽。

③如果在原型链上层存在name并且它是一个setter,那就一定会调用这个setter。name不会被添加到myObject,也不会重新定义这个setter。

如果你希望在①和②下屏蔽name,那就不能使用=操作符来赋值,而是使用Object.defineProperty(...)向myObject添加name

上一篇下一篇

猜你喜欢

热点阅读