javascript对象的property和prototype是这样一种关系


Posted in Javascript onMarch 24, 2007

ECMAScript可以识别两种类型的对象,一种叫做Native Object属于语言范畴;一种叫做Host Object,由运行环境提供例如document对象, 
Dom Node等 
Native objects是一种松散的结构并且可以动态的增加属性(property),所有的属性都有一个名字和一个值,这个值可以是另一个对象的引用 
或者是内建的数据类型(String, Number, Boolean, Null 或者 Undefined) 
下面的这个简单的例子描述了一个javascript对象是如何设置一个属性的值和如何读取属性的值的。
赋值操作 
一个对象的属性的创建非常简单,直接通过赋值操作就可以完成属性的创建。 

var objectRef = new Object(); //create a generic javascript object.   
一个名为testNumber的属性可以这样创建。 

objectRef.testNumber = 5;   
/* - or:- */  
objectRef["testNumber"] = 5;   
如果复制的属性名称已经存在那么不会再次创建这个属性,赋值操作仅仅是重新设置属性的值 

objectRef.testNumber = 8;   
/* - or:- */  
objectRef["testNumber"] = 8;   
js对象的原型(prototype)自己本身也可以是对象,也可以有属性(property),对于js对象的(prototype)的赋值操作跟普通对象属性的创建 
没什么不同。 
取值操作 
在取值操作中property和prototype就不一样了,先看最简单的property取值操作。 

/*为一个对象的属性赋值,如果这个对象没有这个属性,那么在赋值操作后,这个对象就有这个属性了 */  
objectRef.testNumber = 8;   
/* 读出这个属性的值 */  
var val = objectRef.testNumber;   
/* 现在val 就得到了刚才赋予objectRef的值8了*/  
prototype揭密 
但是所有的对象都可以有prototypes, prototypes自己也是对象,那么他也可以有prototypes,这样循环下去就形成了一个prototype链, 
这个链当他遇到链中队形的prototype是null时中止。(Object的默认的prototype是null) 

var objectRef = new Object(); //create a generic javascript object.   
创建一个新的js对象,这时这个对象的prototype是Null,所以objectRef的prototype链只包含一个对象Object.prototype 
我们在看下面的 

/* 构建MyObject1这个类型的构造函数  
   MyObject1 - type.  
*/  
function MyObject1(formalParameter){   
    /* 为者对象创建一个属性名字叫testNumber  
    */  
    this.testNumber = formalParameter;   
}   
/* 构建MyObject2这个类型的构造函数  
   MyObject2 - type:-  
*/  
function MyObject2(formalParameter){   
   /* 为者对象创建一个属性名字叫testString*/  
    this.testString = formalParameter;   
}   
/* 下一步的操作会用MyObject1对象替换掉MyObject2默认的prototype属性*/  
MyObject2.prototype = new MyObject1( 8 );   
/* 最后我们创建MyObject2类型的一个对象*/  
var objectRef = new MyObject2( "String_Value" );   
objectRef这个MyObject2类型的对象有一个prototype的链,链中的第一个对象是MyObject1对象,MyObject1对象也有prototype, 
这个prototype是Object默认的prototype,Object.prototype的prototype是null,至此这条prototype链结束。 
当一个取值操作发生时,objectRef 的整个prototype链就开始工作 

var val = objectRef.testString;   
objectRef这个对象的有一个属性叫做testString,那么这句会把testString的值赋给val 

var val = objectRef.testNumber;   
在objectRef这个对象里并没有testNumber这个属性,但是val却的到了值8,而不是undefine,这是因为解释器在没有在当前对象找到要找 
的属性后,就会去检查这个对象的prototype,objectRef的prototype是MyObject1对象,这个对象有testNumber这个属性,所以val得到8这个值。 

var val = objectRef.toString;   
现在val是个function的引用,这个function是Object.prototype的property,由于MyObject1和MyObject2都没有定义toString这个property 
所以Object.prototype返回。 

var val = objectRef.madeUpProperty;   
最后val是undefined,因为MyObject1和MyObject2,还有Object都没有定义madeUpProperty这个property,所以得到的是undefine.
读操作会读取在obj自己和prototype 链上发现的第一个同名属性值 
写操作会为obj对象本身创建一个同名属性(如果这个属性名不存在 
这就意味着objectRef.testNumber = 3会在objectRef对象上创建一个property,名字是testNumber,当下一次在要读取testNumber时 
propertype链就不会工作,仅仅会得到objectRef的property 3,而MyObject1的testNumber属性并不会被修改。下面的可以验证 

/* 构建MyObject1这个类型的构造函数  
   MyObject1 - type.  
*/  
function MyObject1(formalParameter){   
    /* 为者对象创建一个属性名字叫testNumber  
    */  
    this.testNumber = formalParameter;   
}   
/* 构建MyObject2这个类型的构造函数  
   MyObject2 - type:-  
*/  
function MyObject2(formalParameter){   
   /* 为者对象创建一个属性名字叫testString*/  
    this.testString = formalParameter;   
}   
/* 下一步的操作会用MyObject1对象替换掉MyObject2默认的prototype属性*/  
var obj1 = new MyObject1( 8 );   
MyObject2.prototype = obj1;   
/* 最后我们创建MyObject2类型的一个对象*/  
var objectRef = new MyObject2( "String_Value" );   
alert(objectRef.testNumber);   
objectRef.testNumber = 5;   
alert(objectRef.testNumber);   
alert(obj1.testNumber); 

Javascript 相关文章推荐
一个简单的js鼠标划过切换效果
Jun 30 Javascript
jQuery 表单验证扩展代码(一)
Oct 11 Javascript
封装html的select标签的js操作实例
Jul 02 Javascript
整理的比较全的event对像在ie与firefox浏览器中的区别
Nov 25 Javascript
js css 实现遮罩层覆盖其他页面元素附图
Sep 22 Javascript
Bootstrap Table表格一直加载(load)不了数据的快速解决方法
Sep 17 Javascript
微信小程序 页面传参实例详解
Nov 16 Javascript
JScript实现地址选择功能
Aug 15 Javascript
基于vue的短信验证码倒计时demo
Sep 13 Javascript
JavaScript定义函数的三种实现方法
Sep 23 Javascript
JavaScript实现美化滑块效果
May 17 Javascript
使用Layer组件弹出多个对话框(非嵌套)与关闭及刷新的例子
Sep 25 Javascript
Ajax一统天下之Dojo整合篇
Mar 24 #Javascript
dojo 之基础篇(三)之向服务器发送数据
Mar 24 #Javascript
dojo 之基础篇(二)之从服务器读取数据
Mar 24 #Javascript
dojo 之基础篇
Mar 24 #Javascript
jQuery使用手册之 事件处理
Mar 24 #Javascript
jQuery使用手册之三 CSS操作
Mar 24 #Javascript
jQuery使用手册之二 DOM操作
Mar 24 #Javascript
You might like
如何利用php+mysql保存和输出文件
2006/10/09 PHP
用PHP控制用户的浏览器--ob*函数的使用说明
2007/03/16 PHP
实用函数4
2007/11/08 PHP
PHP中uploaded_files函数使用方法详解
2011/03/09 PHP
PHP中使用gettext来支持多语言的方法
2011/05/02 PHP
使用PHP获取汉字的拼音(全部与首字母)
2013/06/27 PHP
php加速器eAccelerator的配置参数、API详解
2014/05/05 PHP
PHP使用PDO连接ACCESS数据库
2015/03/05 PHP
php实现根据IP地址获取其所在省市的方法
2015/04/30 PHP
PHP实现批量修改文件后缀名的方法
2015/07/30 PHP
Ubuntu server 11.04安装memcache及php使用memcache来存储session的方法
2016/05/31 PHP
如何在PHP中使用数组
2020/06/09 PHP
PHP生成图表pChart的示例解析
2020/07/31 PHP
extjs 的权限问题 要求控制的对象是 菜单,按钮,URL
2010/03/09 Javascript
jQuery+jqmodal弹出窗口实现代码分明
2010/06/14 Javascript
jquery实现table鼠标经过变色代码
2013/09/25 Javascript
js行号显示的文本框实现效果(兼容多种浏览器 )
2015/10/23 Javascript
JavaScript实现跑马灯抽奖活动实例代码解析与优化(一)
2016/02/16 Javascript
JavaScript  event对象整理及详细介绍
2016/10/10 Javascript
详解在Node.js中发起HTTP请求的5种方法
2019/01/10 Javascript
谈谈为什么你的 JavaScript 代码如此冗长
2019/01/30 Javascript
vue鼠标悬停事件实例详解
2019/04/01 Javascript
ES6 Promise对象概念及用法实例详解
2019/10/15 Javascript
[13:40]TI3青蛙君全程回顾 DOTA2我们为梦想再战
2013/09/13 DOTA
Python实现的数据结构与算法之快速排序详解
2015/04/22 Python
用Python编写简单的定时器的方法
2015/05/02 Python
使用Python制作微信跳一跳辅助
2018/01/31 Python
python实现的自动发送消息功能详解
2019/08/15 Python
有关HTML5页面在iPhoneX适配问题
2017/11/13 HTML / CSS
美国专业级皮肤病和spa品质护肤品的高级零售网站:SkinCareRx
2017/02/06 全球购物
计生工作先进事迹
2014/08/15 职场文书
交通违章检讨书
2014/09/21 职场文书
2015年百日安全活动总结
2015/03/26 职场文书
2016教师暑期培训学习心得体会
2016/01/09 职场文书
Python实现Telnet自动连接检测密码的示例
2021/04/16 Python
关于MySQL临时表为什么可以重名的问题
2022/03/22 MySQL