十分钟带你深入了解javascript的原型和原型链_第1页
十分钟带你深入了解javascript的原型和原型链_第2页
十分钟带你深入了解javascript的原型和原型链_第3页
十分钟带你深入了解javascript的原型和原型链_第4页
全文预览已结束

下载本文档

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

文档简介

第十分钟带你深入了解javascript的原型和原型链所有引用类型(函数,数组,对象)都拥有__proto__属性(隐式原型)

所有函数拥有prototype属性(显式原型)(仅限函数)

原型对象:拥有prototype属性的对象,在定义函数时就被创建

二,构造函数

先复习下构造函数

//创建构造函数

functionWord(words){

this.words=words;

Wtotype={

alert(){

alert(this.words);

//创建实例

varw=newWord(helloworld

w.print=function(){

console.log(this.words);

console.log(this);//Person对象

w.print();//helloworld

w.alert();//helloworld

print()方法是w实例本身具有的方法,所以w.print()打印helloworld;alert()不属于w实例的方法,属于构造函数的方法,w.alert()也会打印helloworld,因为实例继承构造函数的方法。

实例w的隐式原型指向它构造函数的显式原型,指向的意思是恒等于

w.__proto__===Wtotype

当调用某种方法或查找某种属性时,首先会在自身调用和查找,如果自身并没有该属性或方法,则会去它的__proto__属性中调用查找,也就是它构造函数的prototype中调用查找。所以很好理解实例继承构造函数的方法和属性:

w本身没有alert()方法,所以会去Word()的显式原型中调用alert(),即实例继承构造函数的方法。

三,原型和原型链

Ftotype.a=a

Ototype.b=b

functionPerson(){}

console.log(Person);//functionPerson()

letp=newPerson();

console.log(p);//Person{}对象

console.log(p.a);//undefined

console.log(p.b);//b

想一想p.a打印结果为undefined,p.b结果为b

解析:

p是Person()的实例,是一个Person对象,它拥有一个属性值__proto__,并且__proto__是一个对象,包含两个属性值constructor和__proto__

console.log(p.__proto__.constructor);//functionPerson(){}

console.log(p.__proto__.__proto__);//对象{},拥有很多属性值

我们会发现p.__proto__.constructor返回的结果为构造函数本身,p.__proto__.__proto__有很多参数

我们调用constructor属性,p.___proto__.__proto__.constructor得到拥有多个参数的Object()函数,Ptotype的隐式原型的constructor指向Object(),即Ptotype.__proto__.constructor==Object()

从p.__proto__.constructor返回的结果为构造函数本身得到Ptotype.constructor==Person()所以p.___proto__.__proto__==Ototype

所以p.b打印结果为b,p没有b属性,会一直通过__proto__向上查找,最后当查找到Ototype时找到,最后打印出b,向上查找过程中,得到的是Ototype,而不是Ftotype,找不到a属性,所以结果为undefined,这就是原型链,通过__proto__向上进行查找,最终到null结束

console.log(p.__proto__.__proto__.__proto__);//null

console.log(Ototype.__proto__);//null

大家理解刚才的过程,相信下面这些应该也都明白

//Function

functionFunction(){}

console.log(Function);//Function()

console.log(Ftotype.constructor);//Function()

console.log(Ftotype.__proto__);//Ototype

console.log(Ftotype.__proto__.__proto__);//NULL

console.log(Ftotype.__proto__.constructor);//Object()

console.log(Ftotype.__proto__===Ototype);//true

总结:

1.查找属性,如果本身没有,则会去__proto__中查找,也就是构造函数的显式原型中查找,如果构造函数中也没有该属性,因为构造函数也是对象,也有__proto__,那么会去它的显式原型中查找,一直到null,如果没有则返回undefined

2.p.__proto__.constructor==functionPerson(){}

3.p.___proto__.__proto__==Ototype

温馨提示

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

评论

0/150

提交评论