从个人校长生涯谈原型和原型链

简述引用类型

关于引用类型的赋值,上篇已经写过。javascript

若是说引用类型是地点,咱们操做的就是它的地址;html

若是说引用类型是房子,咱们操做的就是它的钥匙;java

若是说引用类型是人物,咱们操做的就是它的手机号;git

若是说咱们不用比喻,咱们操做的就是它的引用。github

至此,除了赞叹个人排比句是多么荡气回肠以外,你必定也发现:web

  • 引用类型就是一种有联系方式的数据类型
  • 这种间接关系,使不一样变量共享同一数据成为事实

例如函数

var a = {n: 1}

用变量a保存了{n: 1}的引用,经过这个引用能够操做{n: 1},这个引用就是联系方式。学习

var b = a

a的引用赋值给b,变量b也保存了{n: 1}的引用,也能够操做{n: 1},这就是共享。prototype

比如,你和你的房间的联系方式,就是房钥匙。3d

由于你有房钥匙,因此你才可以进房间,操做房间里面的东西。

若是路人甲默默复制一把,路人甲就能够和你同样,可以操做房间里的东西,这就是共享。

问题来了————

你俩虽然有你房间的钥匙,可是你俩拥有这个房间吗?

答案是确定的。

即便是间接拥有,也是拥有。

好了,明白了上面的东西,原型就不是问题了。

个人校长生涯

在表达我对原型的理解以前,我想先讲一个发生在我身上的不真实的故事。

接下来,我将讲述个人一次创办学校的经历。

阶段1、白手起家

回到多年前。

我是小强,此时我正打算建立一所学校,因此你们也能够叫我小强校长。

首先,我要培养一个老师来替我上课,由于做为一个校长,我还有不少其它事情要作。

很快,我将多年的教学经验传授给一个叫孔仔的人,培养出第一个老师。

后来呢,孔仔也培养出一批又一批的学生。

阶段2、学科多样化

学校算是建成,孔仔也能完成教学任务,不断培养学生。

可是我发现一个问题,一我的的力量毕竟有限,虽然孔仔能完成基本教学,却没有精力在每一个学科上作到专精。

这就致使,培养出来的学生没有专长,大多很普通。

终于有一天,个人学校获得许多好心人的赞助,我当时表示力度大点十分感谢。

钱多了,我就能够培养出更多的老师,不一样特点的老师又能够培养出不一样特点的学生,这不正是个人毕生所追求的东西吗?

因而,个人学校除了孔仔老师,又有了语文老师、数学老师、思想品德老师......

并且我还能够培养更多学科的老师。

阶段3、建设图书室

不知什么时候开始,有一些老师会找我申请一些教学方法的书,这我是十分支持的,能够说是有求必应。

随着申请的老师愈来愈多,我总结了一些不少老师会用到的教学方法的书,因而我就想:

不如我在本身办公室旁边建设一个图书室,把这些经常使用的书放在里面,老师们想看的时候来这里看不就好了。

很快有老师向我反映,他们其实也有相同的困扰,学生也会向他们申请一些课程相关的书,并且常常是相同的。

因而我决定,只要是老师,都要有一个本身的图书室,存放本身学生一般会用到的书或器材。

我也是老师,我是老师的老师。

因此,各科老师的图书室通常都存放各自文化知识方面的教材,而个人办公室存放的是教学经验方面的教材。

立刻就要开工了!

但是我又发现,像《小学生必读》这类书,几乎在每一个老师的办公室都有,我想:

不如把这类全校学生都读的书,放在同一个地方吧,这样就能够省下更多钱吃喝玩乐建设学校。

我第一想到的,就是孔仔老师,孔仔老师毕竟是咱们学校的元老,同时他教的内容是最宽泛的、最不专门的,图书室应该相对空旷,因此就把《小学生必读》这类几乎全部学生都会看的书籍统一放到他的图书室吧。

因而我决定,在给每一个老师建造图书室的同时,都建造一条隧道通往孔仔老师的图书室。

个人图书室也是那时候建的,因此个人图书室也有一条通往孔仔老师的隧道。

这样,我培养出来的老师,想看教学经验方面的书籍,就能够到个人图书室。

而我校老师培养出来的学生,想看本身学习方面的书籍,就能够到本身老师的图书室;

若是没有的话,就能够经过本身老师的图书室里的隧道,来到孔仔老师的图书室,看有没有想看的书籍。

这样个人学校就完美了,小强校长仍是挺不错的哈?

原型和原型链

先把图放在这里。

javascript的培训方式

在javascript中,Function扮演的就是校长的角色。

首先,他不想亲自去培养学生,因此他培养出了第一个老师孔仔。

Object就至关于孔仔同样能够培养出学生,即经过new Object能够建立对象。

可是,校长为了学生的多样化,又培养了语文老师、数学老师、思想品德老师等老师,并且还能够按须要培养更多老师;

一样,开发者想要建立多样化的数据、符合须要的对象,诸如StringNumberBoolean这些函数对象也必不可少的,并且也能够根据须要写各类构造函数。

能够看到,校长培训出老师,老师再培训出学生;

Function建立函数对象,函数对象再建立对象;

只不过javascript的培训方式是new

javascript的图书室

校长为了不给每位老师买教学经验方面的书,因此建立了本身的图书室,用来让本身培养的老师共享这些资源;

而咱们的Function,也并不想把那些经常使用的方法都复制一份,保存到ObjectStringArray...以及后来新建立的N多构造函数当中,因而新增一个属性prototype(即原型对象),把一些公共的方法存在里面;

Function让它建立出来的函数对象共享prototype的方式,就是在经过new Function建立函数对象的同时,会使

被建立的函数对象.__proto__ = Function.prototype

好比,在建立Object的时候,会使

Object.__proto__ = Function.prototype

这个场景似曾相识?

没错,这就是我小强校长在建立本身的图书室后,将图书室钥匙送给孔仔老师一把的情景。

此后,孔仔老师就能够来个人图书室,查阅教学经验相关的书籍。

同理,Object也所以能够访问Functionprototype,使用Function为他们精心准备的函数对象的方法。

验证

Object.__proto__ === Function.prototype     // true

这里的true表示的就是,钥匙已拿到,Object已拥有Functionprototype

接下来,可能会更多用到“拥有”这个词语

为何呢?

虽然,根据开篇对引用类型的介绍,可知Object.__proto__ = Function.prototype所作的事情:

无非就是,Function把公共的方法都放在某个房间里,再将钥匙存在本身的属性prototype里;

在赋值时,就是复制了一把prototype里的钥匙,而后存在Object的属性__proto__中。

从这个过程能够看出,原型也不过是引用类型的赋值,就是经过一种联系方式间接拥有某个东西。

本篇文章开始说过,

即便是间接拥有,也是拥有。

首先,对引用类型的及其赋值的理解是必要的。

可是,在理解原型和原型链过程当中,能够没必要太关注引用类型赋值过程这种细节。

由于原型的目的,就是让实例们都拥有有一个公共区域,方便使用一些经常使用的方法。

因此相似Object.__proto__ === Function.prototype这种吓人的结构,它要表达的不过就是这个意思:

前者已经拥有了后者提供的公共区域。

就像个人校长生涯那样,当我发现建图书室的做用以后,并不止为本身培养的老师建了图书室。

只要是老师,都要有一个本身的图书室,存放本身学生一般会用到的书或器材

这样,把一些学生的教材也变成共享,就又省得给每一个学生都重复买教材。

也就是,不只Function建立函数对象时,会

被建立的函数对象.__proto__ = Function.prototype

并且函数对象在建立对象时,会

被建立的对象.__proto__ = 建立对象的函数对象.prototype

总结一下,只要new的时候,就会

实例.__proto__ = 建立者.prototype

即只要我建立了你,你就拥有了个人公共区域。

javascript的隧道

回顾个人校长生涯,在我即将开工给我和每位老师建图书室以前,我又想到:

每一个老师的图书室里的书,也有不少是重复的,不如把这些重复的都放到元老级教师孔仔的图书室吧。

但是学生只能进各自老师的图书室,怎么让他们也能进孔仔老师的图书室呢?

还记得睿智的小强校长是怎么作的吗:

在建每件图书室的同时,修一条隧道能够到达孔仔老师的图书室,即Function建立对象的同时会

被建立的函数对象.prototype.__proto__ = Object.prototype

例如

Array.prototype.__proto__ === Object.prototype      // true

没错,对于javascript来讲,Object就是孔仔老师,Objectprototype就是孔仔老师的图书室。

为了减小不一样函数对象的prototype的重复,咱们把很通用的对象的方法都放到Objectprototype中,并经过上述方法让其它函数都的prototype都拥有它。

这样,每一个对象都拥有函数的prototype,每一个函数的prototype又都拥有Objectprototype,那么每一个对象也都拥有Objectprototype,即对象总能找到早就给它们精心准备好的方法的;

不一样原型之间这个不依不饶的关系,就是原型链。

对于学生来说,他们能够去的办公的总和、以及前后顺序,就至关于咱们的原型链。

如图

关于“隧道”的建成,还有一些重要问题:

实际上,被建立的函数对象.prototype.__proto__ = Object.prototype,并不是Function作到的,而是Object作到的。

这里,Object实际上是使用的这一规则:

只要我建立了你,你就拥有了个人公共区域

由于javascript的建立方式是new,要想实现被建立的函数对象.prototype.__proto__ = Object.prototype,须要先有

被建立的函数对象.prototype = new Object()

即全部对象的prototype都是Object建立的,都是Object的实例。

其它函数对象的prototype所以才能拥有Objectprototype,即实现这种效果

被建立的函数对象.prototype.__proto__ = Object.prototype

那么,若是你是类比个人校长生涯来理解原型的,你就会想:

new在故事中不是“培训”的意思吗,这是否是说,其它的图书室都是孔仔“培训”出来的?

其实,这里咱们自圆其说灵活理解就好了,毕竟例子只是用来帮助理解的。

因此,咱们的“new”在这时候就是“建立”的意思。

在javascript中,全部对象的prototype都是Object建立的,那么

在个人校长生涯中,故事可能就是这样的:

个人校长生涯后记

这个时刻,学校还只是我(小强校长)和孔仔两我的。

我说,孔仔,为了实现资源的共享,我有一个想法。

孔仔说,啥想法?

我说,把你培养出来后,我已经很累了,可是咱们这个学校未来确定会获得好心人的捐助,也必定会培养更多的老师,老师们也必定须要教学经验方面的学习素材。若是每人我都发一套的话,就有点贵。因此我想给本身建造一个图书室,专门放这些资料,这样无论是你,仍是之后培养出来的老师,就均可以在这里共享这些资源了。你以为怎样,孔仔?

孔仔说,小强校长真抠门英明啊!您看这样如何,每一个老师也都建设一个本身的图书室,这样,不少给学生的教材就不用重复买了,他们想用想看的时候去老师的图书室里找就好了,更省钱。

我说,只给学生们开一个图书室不能够吗,每一个老师都有图书室会不会浪费?

孔仔说,不太好吧,毕竟不一样学科的学生,使用教材的差别仍是挺大的,不是很通用,仍是建议每一个老师都有各自的图书室,方便管理。

我说,有道理,可是总有一些通用的教材,好比《小学生必读》这种,不必每一个老师的图书室里都放一套,不够省钱。

孔仔说,您的意思是?

我说,放你那里吧。

孔仔已经跟不上个人思路,问,其余老师的学生都是去各自老师的图书室啊,这样只有个人学生能看到《小学生必读》这类书吧?

我说,这还不简单,每一个老师的图书室都修一条隧道通向你的图书室。

孔仔沉默。

我说,修图书室的事情,就由你来负责吧!先给本校长来一个图书室吧。

孔仔说,不能,我要先给本身修建一个图书室,不然给你修建的时候不知道隧道通向哪里。

我说,好吧。

今后,每当我培养出一个老师,孔仔就帮忙修建一个图书室,同时挖一条隧道通往他本身的图书室。

咱们的学校也愈来愈好。

其它你可能关心的事项

  • Function.prototype.__proto __ === Object.prototype ?

对。建设每一个图书室的时候,孔仔都挖隧道通向本身的办公室了,包括校长的办公室。

  • Function.prototype.__proto === null ?

对。咱们说好把通用资源都放在孔仔办公室,现在已经来到孔仔办公室,还想去哪里?

  • 先有的Function仍是先有的Object?

先有的Function。孔仔是我培养出来的,固然是先有的本校长。

  • 先有的Function.prototype仍是先有的Object.prototype?

先有的Object.prototype。否则孔仔修建图书室的时候,怎么知道把隧道通向哪里。

  • constructor是什么?

原型的constructor放的是该原型所属的函数对象,即每一个图书室里都放在该图书室所属老师的联系方式,好比电话号码。

  • 小强校长帅吗?

颜值爆表。


若是你有其它关心的事项,能够发表评论或者联系我,或者在这里查看最新更改。

相关文章
相关标签/搜索