JavaScript中对象property的读取和写入方法介绍


Posted in Javascript onDecember 30, 2014

JavaScript中,可以通过点号操作符”.”或者中括号操作符”[]“来对对象的property进行读取和写入:

var o = {x:1, y:2};

console.log(o.x);//1

console.log(o["y"]);//2

o.y = 7;

console.log(o["y"]);//7

值得注意的是,如果使用中括号操作符,则操作符内的值类型必须是string,或者能够转换成string的表达式:

console.log(o[y]);//ReferenceError: y is not defined

var v = "y";

console.log(o[v]);//7

与Java语言不同的是,JavaScript中对象的property可以动态添加或删除。当对某个property进行赋值操作时,如果该property不存在,JavaScript会在对象中动态添加此property:

o.z = 99;

console.log(o);//Object {x=1, y=7, z=99}

 

原型继承链中property的读取

 

JavaScript中所有的对象均有一个prototype原型对象,并从该原型对象中继承property;因此,JS中一个对象的property分成两大类:

1.对象自身所拥有的property(“Own Property”)。
2.从原型对象处继承而来的property。

当读取对象的property时,所遵循的规则如下:

1.从对象自身的property集合(“Own Property”)中搜索需要读取的property;如果可以搜索到,则直接读取该property并返回其值。
2.如果无法从对象自身的property集合(“Own Property”)中搜索到该property,那么则从对象的prototype原型链中继续进行搜索,直至搜索到该property并返回其值。
3.如果无法从对象自身的property集合(“Own Property”)中搜索到该property,也无法从对象的所有prototype对象中搜索到该property,则返回undefined。

原型继承链中property的写入

在对JavaScript对象的property进行写入时,所遵循的规则如下:

1.如果对象自身有该property,且该property可写,则将新值写入该property。如果该property只读,则报错。
2.如果对象自身没有该property,且其所有的prototype对象中也不存在该property,则将此property添加到该对象中。
3.如果对象自身没有该property,但其prototype对象中存在该property且可写,那么JS会在对象中新建这个property;也就是说,该对象覆写了其prototype对象中的这个property。prototype对象中此property值不变。
4.如果对象自身没有该property,但其prototype对象中存在该property且只读,则报错。
5.如果对象自身没有该property,但其prototype对象中存在该property的setter方法,那么JS会调用该prototype对象中的setter方法。值得注意的是,在运行setter方法时,如果涉及到变量赋值,那么赋值操作将作用在对象自身上,而prototype对象不会有任何改动。对于这一行为,可以理解为:对象从prototype处继承了setter函数并加以执行。

从上述规则中可以发现,如果对property的赋值操作成功,那么最后被修改的永远是对象自身,其prototype原型对象不会有任何改动。

Javascript 相关文章推荐
JavaScript中获取未知对象属性的代码
Apr 27 Javascript
JavaScript实现快速排序(自已编写)
Dec 19 Javascript
Javascript玩转继承(三)
May 08 Javascript
JQuery 在线引用及测试引用是否成功
Jun 24 Javascript
ES6的新特性概览
Mar 10 Javascript
JavaScript实战之菜单特效
Aug 16 Javascript
jQuery Validate 相关参数及常用的自定义验证规则
Mar 06 Javascript
Angular中点击li标签实现更改颜色的核心代码
Dec 08 Javascript
node前端开发模板引擎Jade的入门
May 11 Javascript
在vue-cli的组件模板里使用font-awesome的两种方法
Sep 28 Javascript
vue路由事件beforeRouteLeave及组件内定时器的清除方法
Sep 29 Javascript
解决Vue中使用keepAlive不缓存问题
Aug 04 Javascript
jQuery中:last选择器用法实例
Dec 30 #Javascript
JavaScript中对象property的删除方法介绍
Dec 30 #Javascript
JavaScript中检查对象property的存在性方法介绍
Dec 30 #Javascript
JavaScript中遍历对象的property的3种方法介绍
Dec 30 #Javascript
JavaScript语言对Unicode字符集的支持详解
Dec 30 #Javascript
JavaScript中的对象的extensible属性介绍
Dec 30 #Javascript
JavaScript中的对象序列化介绍
Dec 30 #Javascript
You might like
PHP实现文件安全下载
2006/10/09 PHP
Win2003+apache+PHP+SqlServer2008 配置生产环境
2014/07/29 PHP
php结合正则批量抓取网页中邮箱地址
2015/05/19 PHP
PHP使用Memcache时模拟命名空间及缓存失效问题的解决
2016/02/27 PHP
简单谈谈PHP中的include、include_once、require以及require_once语句
2016/04/23 PHP
jquery基础教程之deferred对象使用方法
2014/01/22 Javascript
Javascript加载速度慢的解决方案
2014/03/11 Javascript
js单词形式的运算符
2014/05/06 Javascript
Ajax清除浏览器js、css、图片缓存的方法
2015/08/06 Javascript
js修改onclick动作的四种方法(推荐)
2016/08/18 Javascript
Bootstrap进度条学习使用
2017/02/09 Javascript
浅谈webpack-dev-server的配置和使用
2018/05/17 Javascript
JavaScript代码异常监控实现过程详解
2020/02/17 Javascript
粗略分析Python中的内存泄漏
2015/04/23 Python
编写Python脚本批量下载DesktopNexus壁纸的教程
2015/05/06 Python
Python的装饰器用法学习笔记
2016/06/24 Python
利用python编写一个图片主色转换的脚本
2017/12/07 Python
Python微信公众号开发平台
2018/01/25 Python
TensorFlow2.1.0安装过程中setuptools、wrapt等相关错误指南
2020/04/08 Python
解决安装新版PyQt5、PyQT5-tool后打不开并Designer.exe提示no Qt platform plugin的问题
2020/04/24 Python
Django多个app urls配置代码实例
2020/11/26 Python
Jmeter调用Python脚本实现参数互相传递的实现
2021/01/22 Python
移动端Web页面的CSS3 flex布局快速上手指南
2016/05/31 HTML / CSS
YOINS官网:时尚女装网上购物
2017/03/17 全球购物
Myprotein法国官网:欧洲第一运动营养品牌
2019/03/26 全球购物
酒店人事专员岗位职责
2013/12/19 职场文书
技能比赛获奖感言
2014/02/14 职场文书
幼儿园教师演讲稿
2014/05/06 职场文书
中学教师师德承诺书
2014/05/23 职场文书
2014年电厂工作总结
2014/12/04 职场文书
党员个人自我评价
2015/03/03 职场文书
2015公司年度工作总结
2015/05/14 职场文书
学校食堂管理制度
2015/08/04 职场文书
银行客户经理培训心得体会
2016/01/09 职场文书
《藏戏》教学反思
2016/02/23 职场文书
MySQL中存储时间的最佳实践指南
2021/07/01 MySQL