javascript原型与原型链.doc_第1页
javascript原型与原型链.doc_第2页
javascript原型与原型链.doc_第3页
javascript原型与原型链.doc_第4页
javascript原型与原型链.doc_第5页
已阅读5页,还剩1页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

javascript原型与原型链学习javascript原型与原型链原理,能够更深入的理解javascript数据类型的使用;在往后的程序开发过程中能够有效的利用javascript编程语言的特点,编写出高效率的程序。一般情况下编写javascript程序,创建对象的抒写方式是var user=name:小红,age:12;学习原型之前需要普及几个js数据类型知识;javascript中所谓的对象,也就是常规意义上的变量;对象分为函数对象和普通对象两种。首先来介绍一下函数对象,以下三种均为函数对象,其实就是函数;重点要注意的是第三种函数的定义方式,如果函数体内部使用了 this 关键字说明这个函数需要使用 new 关键字声明对象使用的,有些像java 和面向对象中的类的概念。function max(a1,a2)if(a1a2)return a1;return a2;var max=function(a1,a2)if(a1a2)return a1;return a2;function User(name,age)=name;this.age=age;使用 new 关键字来创建 User 函数对象的实例化对象:如果不涉及js面向对象编程的概念,正常意义上的this关键字所代表的其实是window对象,自定义的变量,函数都隶属于window对象。通过new关键字能够新创建内存空间,所自定义的变量和函数都隶属于当前操作对象,不隶属于window对象。例如:var user1=new User(小红,23);var user2=new User(小明,24);user1和user2两个变量同时都使用User函数对象初始化,其中的数据(小红,小明)都各自保存在自己内存空间的name变量中。; /小红; /小明所谓普通对象是通过 new 关键字使用函数对象创建出来的变量都是普通对象,如:var user1=new User(小红,23);/user1 就是普通对象那么还有一种对象是如下的定义方式,我们会有疑问这种对象并没有使用new 关键字?var test=name:小明,sex:女;其实这种对象也是通过new 关键字创建的,属于系统隐含创建,其使用的函数对象是系统默认的:function Object() 系统应该是这样隐含定义的:var user=new Object();为什么能够推理出 自定义对象 是由Object 函数对象初始化的呢?这就要引入我们的主题:原型与原型链原型javascript中所有的函数对象都具有一个原型实例,所谓原型就是这个函数对象是由哪个函数对象的实例产生的。/我们可以使用 全等符号 = 来测试函数对象中原型的存在:函数对象获取原型对象:function User(name,age)=name;this.age=age;Utotype /prototype 即返回原型对象。系统默认的prototype是这样的:function User();var user1=new User();Utotype=user1;Utotype.constructor=User;系统默认的prototype,就是函数对象自己,使用 new 关键字产生的普通对象。注意:prototype.constructor 构造器所指向的一般是函数对象自己,用于当程序运行时使用 new 关键字创建对象时,根据constructor调用;如果prototype 被使用 new 赋值过其他函数对象,则constructor会被清空,需要重新为constructor赋值。普通对象也可以获取原型对象,用以说明这个这个普通对象是由哪个函数对象创建的:var user1=new User();user1._proto_说明:_proto_ 用于指向创建user1的函数对象(User)的原型对象(prototype)。测试:function User(name,age)=name;this.age=age;var user1=new User(小红,23);window.alert(user1._proto_=(Utotype) ); /弹出 true注意:属性 _proto_ 在IE浏览器中获取不到,但是功能实现的意义存在。继承的实现下面的例子阐述了如何使用prototype 实现javascript继承;示例描述:创建了一个Job函数对象,User函数对象,使一个普通用户拥有工作者身份,即使用User函数对象继承Job函数对象。function Job(job,level)this.job=job;this.level=level;this.dis=function()var str=;str+=n工作:+this.job;str+=n职位:+this.level;return str;function User(name,sex)=name;this.sex=sex;this.dis=function()var str=;str+=n姓名:+;str+=n性别:+this.sex;str+=n工作:+this.job;str+=n职位:+this.level;return str;Utotype=new Job(软件开发,软件工程师);Utotype.constructor=User;var user1=new User(小红,女);window.alert(user1.dis();var user2=new User(小明,男);window.alert(user2.dis();输出结果:参考上面的代码,试想毕竟javascript还是基于对象的编程语言,因此函数对象的prototype属性只能接收使用new关键字创建出的普通对象。致使上面的例子中我们创建的小红和小明的工作和职位都是“软件开发”,“软件工程师”,不过可以通过修改代码实现的方式纠正这个问题,使程序更加灵活。原型链如果明白了js原型的概念,那么原型链的思想就很容易理解。javascript中每种函数对象使用 new 关键字产生的普通对象都具备原型对象指针即: _proto_我们可以测试一下系统自带的数据类型:数组类型测试:var arr=小红,小明;window.alert( arr._proto_=Atotype );/弹出:true说明:数组对象的原型指针_proto_,指向的是数组函数的原型对象。字符串类型测试:var str=这个一个字符串;window.alert( str._proto_=Stotype );/弹出:true说明:字符串对象的原型指针_proto_,指向的是字符串函数的原型对象。思考,字符串对象的原型指针,指向的是字符串函数的原型对象;因为字符串函数的原型对象也是个普通对象,因此也具备指针属性,因此可以一直使用指针关联下去;如此便形成了原型链。例如:function User(name,age)=name;this.age=age;var user=new User(小红,女);window.alert( user._proto_=Utotype );window.alert(Utotype._proto_=Ototype);window.alert(Ototype._proto_);链式关系:user._proto_ 指向 UtotypeUtotype._proto_ 指向 OtotypeOtotype._proto_ 指向 null (至此原型链到此结束)根据原型链的关系可以得知,javascript对象中那么多的属性和方法都是很多函数对象互相继承产生的;可想而知 for-in循环是很耗费时间的算法。hasOwnProperty在原型链环境中可以通过使用 普通对象.hasOwnProperty(属性名/方法名) 成员函数判断这个属性/方法,是当前函数对象具有的,还是经过原型链继承过来的。格式:boolean 普通对象.hasOwnProperty(属性名/方法名)返回:true = 当前对象的原型函数对象具有的。false = 经过原型链继承过来的。例如:function Job(job)this.job=job;function User(name,sex)=name;this

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论