比较详细的javascript对象的property和prototype是什么一种关系


Posted in Javascript onAugust 06, 2007

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

赋值操作
一个对象的属性的创建非常简单,直接通过赋值操作就可以完成属性的创建。
代码

   1. var objectRef = new Object(); //create a generic javascript object.  

一个名为testNumber的属性可以这样创建。
代码

   1. objectRef.testNumber = 5;  
   2. /* - or:- */  
   3. objectRef["testNumber"] = 5;  

如果复制的属性名称已经存在那么不会再次创建这个属性,赋值操作仅仅是重新设置属性的值
代码

   1. objectRef.testNumber = 8;  
   2. /* - or:- */  
   3. objectRef["testNumber"] = 8;  

js对象的原型(prototype)自己本身也可以是对象,也可以有属性(property),对于js对象的(prototype)的赋值操作跟普通对象属性的创建
没什么不同。

取值操作
在取值操作中property和prototype就不一样了,先看最简单的property取值操作。
代码

   1. /*为一个对象的属性赋值,如果这个对象没有这个属性,那么在赋值操作后,这个对象就有这个属性了 */  
   2. objectRef.testNumber = 8;  
   3. /* 读出这个属性的值 */  
   4. var val = objectRef.testNumber;  
   5.   
   6. /* 现在val 就得到了刚才赋予objectRef的值8了*/  

prototype揭密

但是所有的对象都可以有prototypes, prototypes自己也是对象,那么他也可以有prototypes,这样循环下去就形成了一个prototype链,
这个链当他遇到链中队形的prototype是null时中止。(Object的默认的prototype是null)
代码

   1. var objectRef = new Object(); //create a generic javascript object.  

创建一个新的js对象,这时这个对象的prototype是Null,所以objectRef的prototype链只包含一个对象Object.prototype
我们在看下面的代码
代码

   1. /* 构建MyObject1这个类型的构造函数 
   2.    MyObject1 - type. 
   3. */  
   4. function MyObject1(formalParameter){  
   5.     /* 为者对象创建一个属性名字叫testNumber 
   6.     */  
   7.     this.testNumber = formalParameter;  
   8. }  
   9.   
  10. /* 构建MyObject2这个类型的构造函数 
  11.    MyObject2 - type:- 
  12. */  
  13. function MyObject2(formalParameter){  
  14.    /* 为者对象创建一个属性名字叫testString*/  
  15.     this.testString = formalParameter;  
  16. }  
  17.   
  18. /* 下一步的操作会用MyObject1对象替换掉MyObject2默认的prototype属性*/  
  19. MyObject2.prototype = new MyObject1( 8 );  
  20.   
  21. /* 最后我们创建MyObject2类型的一个对象*/  
  22.   
  23. var objectRef = new MyObject2( "String_Value" );  

objectRef这个MyObject2类型的对象有一个prototype的链,链中的第一个对象是MyObject1对象,MyObject1对象也有prototype,
这个prototype是Object默认的prototype,Object.prototype的prototype是null,至此这条prototype链结束。
当一个取值操作发生时,objectRef 的整个prototype链就开始工作
代码

   1. var val = objectRef.testString;  

objectRef这个对象的有一个属性叫做testString,那么这句代码会把testString的值赋给val
代码

   1. var val = objectRef.testNumber;  

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

   1. var val = objectRef.toString;  

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

   1. 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属性并不会被修改。下面的代码可以验证
代码

   1. /* 构建MyObject1这个类型的构造函数 
   2.    MyObject1 - type. 
   3. */  
   4. function MyObject1(formalParameter){  
   5.     /* 为者对象创建一个属性名字叫testNumber 
   6.     */  
   7.     this.testNumber = formalParameter;  
   8. }  
   9.   
  10. /* 构建MyObject2这个类型的构造函数 
  11.    MyObject2 - type:- 
  12. */  
  13. function MyObject2(formalParameter){  
  14.    /* 为者对象创建一个属性名字叫testString*/  
  15.     this.testString = formalParameter;  
  16. }  
  17.   
  18. /* 下一步的操作会用MyObject1对象替换掉MyObject2默认的prototype属性*/  
  19. var obj1 = new MyObject1( 8 );  
  20. MyObject2.prototype = obj1;  
  21.   
  22. /* 最后我们创建MyObject2类型的一个对象*/  
  23.   
  24. var objectRef = new MyObject2( "String_Value" );  
  25.   
  26. alert(objectRef.testNumber);  
  27. objectRef.testNumber = 5;  
  28. alert(objectRef.testNumber);  
  29. alert(obj1.testNumber);  

Javascript 相关文章推荐
JavaScript中的History历史对象
Jan 16 Javascript
网络图片延迟加载实现代码 超越jquery控件
Mar 27 Javascript
JS使用oumousemove和oumouseout动态改变图片显示的方法
Mar 31 Javascript
JavaScript面向对象之私有静态变量实例分析
Jan 14 Javascript
vue axios 表单提交上传图片的实例
Mar 16 Javascript
webpack本地开发环境无法用IP访问的解决方法
Mar 20 Javascript
Angular模版驱动表单的使用总结
May 05 Javascript
JavaScript事件委托原理与用法实例分析
Jun 07 Javascript
js最实用string(字符串)类型的使用及截取与拼接详解
Apr 26 Javascript
修改layui的后台模板的左侧导航栏可以伸缩的方法
Sep 10 Javascript
用Golang运行JavaScript的实现示例
Nov 25 Javascript
VUE table表格动态添加一列数据,新增的这些数据不可以编辑(v-model绑定的数据不能实时更新)
Apr 03 Javascript
解析arp病毒背后利用的Javascript技术附解密方法
Aug 06 #Javascript
用JTrackBar实现的模拟苹果风格的滚动条
Aug 06 #Javascript
随机显示经典句子或诗歌的javascript脚本
Aug 04 #Javascript
比较详细的关于javascript中void(0)的具体含义解释
Aug 02 #Javascript
可实现多表单提交的javascript函数
Aug 01 #Javascript
用倒置滤镜把div倒置,再把table倒置。
Jul 31 #Javascript
取键盘键位ASCII码的网页
Jul 30 #Javascript
You might like
星际争霸, 教主第一视角, ZvT经典龙蛇演义
2020/03/02 星际争霸
php加速器eAccelerator的配置参数、API详解
2014/05/05 PHP
PHP远程采集图片详细教程
2014/07/01 PHP
BOOM vs RR BO5 第三场 2.14
2021/03/10 DOTA
jQuery实现购物车数字加减效果
2015/03/14 Javascript
jquery实现鼠标滑过小图查看大图的方法
2015/07/20 Javascript
AngularJs中route的使用方法和配置
2016/02/04 Javascript
jQuery调用Webservice传递json数组的方法
2016/08/06 Javascript
JavaScript编写一个简易购物车功能
2016/09/17 Javascript
JavaScript实现弹出广告功能
2017/03/30 Javascript
angular.JS实现网页禁用调试、复制和剪切
2017/03/31 Javascript
在页面中引入js的两种方法(推荐)
2017/08/29 Javascript
Jquery如何使用animation动画效果改变背景色的代码
2020/07/20 jQuery
[01:30:55]VG vs Mineski Supermajor 败者组 BO3 第三场 6.6
2018/06/07 DOTA
[48:24]完美世界DOTA2联赛PWL S3 Forest vs INK ICE 第一场 12.09
2020/12/12 DOTA
使用Python程序抓取新浪在国内的所有IP的教程
2015/05/04 Python
Django数据库表反向生成实例解析
2018/02/06 Python
python如何让类支持比较运算
2018/03/20 Python
Python txt文件加入字典并查询的方法
2019/01/15 Python
python删除列表元素的三种方法(remove,pop,del)
2019/07/22 Python
解决Django layui {{}}冲突的问题
2019/08/29 Python
解决Django删除migrations文件夹中的文件后出现的异常问题
2019/08/31 Python
在Python中利用pickle保存变量的实例
2019/12/30 Python
使用Django和Postgres进行全文搜索的实例代码
2020/02/13 Python
python自动化测试三部曲之request+django实现接口测试
2020/10/07 Python
Python暴力破解Mysql数据的示例
2020/11/09 Python
Python安装Bs4的多种方法
2020/11/28 Python
Python OpenCV中的numpy与图像类型转换操作
2020/12/11 Python
欧洲领先的电子和电信零售商和服务提供商:Currys PC World Business
2017/12/05 全球购物
英国儿童设计师服装的领先零售商:Base
2019/03/17 全球购物
Myprotein法国官网:欧洲第一运动营养品牌
2019/03/26 全球购物
读书活动总结
2014/04/28 职场文书
群众路线查摆问题整改措施
2014/10/10 职场文书
国博复兴之路观后感
2015/06/02 职场文书
Python提取PDF指定内容并生成新文件
2021/06/09 Python
带你了解CSS基础知识,样式
2021/07/21 HTML / CSS