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 相关文章推荐
JScript的条件编译
May 29 Javascript
利用js(jquery)操作Cookie的方法说明
Dec 19 Javascript
js常用数组操作方法简明总结
Jun 20 Javascript
jQuery表单事件实例代码分享
Aug 18 Javascript
AngularJS实现按钮提示与点击变色效果
Sep 07 Javascript
BootStrap按钮标签及基本样式
Nov 23 Javascript
简单实现bootstrap导航效果
Feb 07 Javascript
Vue.js:使用Vue-Router 2实现路由功能介绍
Feb 22 Javascript
webpack实现热更新(实施同步刷新)
Jul 28 Javascript
echarts实现地图定时切换散点与多图表级联联动详解
Aug 07 Javascript
JS回调函数 callback的理解与使用案例分析
Sep 09 Javascript
JavaScript switch语句使用方法简介
Dec 30 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中使用redis
2013/11/04 PHP
PHP6 中可能会出现的新特性预览
2014/04/04 PHP
双冒号 ::在PHP中的使用情况
2015/11/05 PHP
php 计算两个时间相差的天数、小时数、分钟数、秒数详解及实例代码
2016/11/09 PHP
详解PHP如何更好的利用PHPstorm的自动提示
2017/08/18 PHP
Laravel下生成验证码的类
2017/11/15 PHP
PHP程序员简单的开展服务治理架构操作详解(二)
2020/05/14 PHP
自适应图片大小的弹出窗口
2006/07/27 Javascript
增强的 JavaScript 的 trim 函数的代码
2007/08/13 Javascript
jquery 弹出层注册页面等(asp.net后台)
2010/06/17 Javascript
JavaScript异步调用定时方法并停止该方法实现代码
2012/03/16 Javascript
使用jquery实现div的tab切换实例代码
2013/05/27 Javascript
基于jQuery实现的仿百度首页滑动选项卡效果代码
2015/11/16 Javascript
jQuery获取父元素节点、子元素节点及兄弟元素节点的方法
2016/04/14 Javascript
js 获取本地文件及目录的方法(推荐)
2016/11/10 Javascript
H5实现仿flash效果的实现代码
2017/09/29 Javascript
微信小程序-getUserInfo回调的实例详解
2017/10/27 Javascript
vue.js中实现登录控制的方法示例
2018/04/23 Javascript
Vue引用Swiper4插件无法重写分页器样式的解决方法
2018/09/27 Javascript
[07:49]2014DOTA2国际邀请赛 Newbee夺冠后采访xiao8坦言奖金会上交
2014/07/23 DOTA
详解Python的Django框架中Manager方法的使用
2015/07/21 Python
fastcgi文件读取漏洞之python扫描脚本
2017/04/23 Python
python 字典 setdefault()和get()方法比较详解
2019/08/07 Python
keras实现基于孪生网络的图片相似度计算方式
2020/06/11 Python
德国低价购买灯具和家具网站:Style-home.de
2016/11/25 全球购物
自我评价怎么写正确呢?
2013/12/02 职场文书
应届生自我鉴定
2013/12/11 职场文书
大三预备党员入党思想汇报
2014/01/08 职场文书
物流创业计划书
2014/02/01 职场文书
个人函授自我鉴定
2014/03/25 职场文书
ktv好的活动方案
2014/08/15 职场文书
2014年环境卫生工作总结
2014/11/24 职场文书
Nginx URL重写rewrite机制原理及使用实例
2021/04/01 Servers
用python修改excel表某一列内容的操作方法
2021/06/11 Python
mysql定时自动备份数据库的方法步骤
2021/07/07 MySQL
java设计模式--三种工厂模式详解
2021/07/21 Java/Android