跳至正文
-
哈哈酷
哈哈酷
  • 首页
  • 示例页面
  • 首页
  • 示例页面
关

搜索

联系
哈哈酷
哈哈酷
  • 首页
  • 示例页面
  • 首页
  • 示例页面
关

搜索

联系
IT

JS中对象属性的读取与设置详解

作者 hahacool
2018年5月17日 1 分钟阅读
0

属性的读取

在语言规范中,object.a在object上实际上是实现了[[Get]]操作。对象默认的[[Get]]操作首先在对象中查找是否有相同的属性名,如果有就返回这个属性。如果没有,就会继续访问对象的[[Prototype]]链。如果无论如何都没找到相同的属性,那么[[Get]]操作就会返回undefined。(相对的,如果你访问一个词法作用域中不存在的变量,不会像对象属性这样返回undefined,而是返回ReferenceError)

 

属性的设置

给属性赋值实现的是[[Put]]操作,情况稍微复杂点。

myObject.foo=”bar”;

  • 如果对象中已经存在这个属性,按如下步骤运行:
  1. 属性访问描述符是否存在setter,如果有的话就调用setter。
  2. 属性数据描述符中writable是否是false?若是,在非严格模式下静默失败,在严格模式下抛出TypeError异常。
  3. 如果都不是,将该值设置为属性的值。
  • 如果对象myObject中不存在这个属性foo,[[Prototype]]链就会被遍历,类似[[Get]]操作。如果原型链上找不到这个属性foo,这个属性foo就会直接被添加在对象myObject上。
  • 如果foo不存在于myObject中而是存在于原型链上层时,foo=”bar”会出现以下三种情况:
  1. 如果在[[Prototype]]链上层存在名为foo的普通数据访问属性,并且没有被标记为只读(writable:false),那么会在myObject中添加一个名为foo的新属性,它是屏蔽属性。
  2. 如果在[[Prototype]]链上层存在名为foo的普通数据访问属性,但是被标记为只读了(writable:false),那么无法修改现有属性或者在myObject上创建屏蔽属性。运行在严格模式下,会抛出一个错误。否则,这条语句会被忽略。总之,不发生屏蔽。这种做法主要是模拟类的继承,你可以吧原型链上层中的foo看做父类的属性,他会被myObject继承,这样foo也是只读,无法创建(A.2)。但是以上的限制只存在于等号=赋值中,Object.defineProperty(..)不受影响。
  3. 如果在[[Prototype]]链上层存在名为foo并且他是一个setter,那就一定调用这个setter。Foo不会被添加到(或者说屏蔽)myObject,也不会重新定义foo这个setter。

 

 

标签:

JS原型链对象
作者

hahacool

关注我
其他文章
上一个

佛教建筑的表法

下一个

程序员的神回复

近期文章

  • 川建国同志二三事
  • 四依法
  • 烦恼以及布施去除之
  • “每天被自己帅到睡不着”用古文怎么说?
  • Vagrant安装CentOS等
  • IT
  • 佛学
  • 其他
  • 笑话
  • 经济

JS mysql PHP sublime text vagrant 一真法界 事件 传说 伤不起 佛 六道 凡人 刹那 十法界 原型链 古文 史上 咆哮体 善 圣人 声闻 女人 完整 度 往生 慈悲 技巧 指南 搞笑 文科 果报 楼主 泡妞 淘宝 烦恼 爆笑 版本 理科 男人 禅定 般若 葱 西游记 训练 雷

沪ICP备16050445号-1

Copyright 2026 — 哈哈酷. All rights reserved. Blogsy WordPress Theme