javascript此生前世

事情得从一个chrome控制台中的无心打印提及。javascript

众所周知,js共六种数据类型,string、number、undefined、boolean、object、null。固然javascript还准备了引用类型,他们都是object对象构造而来,以下图所示的Function、Array、Date...vue

              

 

话说到这儿,Array instanceof Object ....这些天然好理解,那么Array instanceof Function这他妈又是什么鬼?那就让咱们来探索一番~java

关系图以下,让咱们细细剖析一下chrome

首先,你要明白一个全天下人都明白的知识点数组

  • 全部的引用类型(数组、对象、函数)都有一个__proto__的属性。
  • 全部的函数都一个prototype属性,他的值也是一个对象。
  • 全部引用类型的__proto__都指向其构造函数的prototype(显式对象)

事情的诞生都源于一个叫Object.protoype的东西,没错就是下面这个东西,函数、对象、数组都有的方法便在这儿。函数

继续打印看看,Object.prototype.__proto___工具

没错,这就是故事的源头... ,这就是造物主造出来的第一个玩意儿...他即是一国之主~prototype

紧接着,造物主又孕育出了一个叫Function的东西,为了凸显等级关系,他便让Function.prototype的__proto__便指向了Object.prototyp(也能够理解为Function的构造函数的原型对象)。不信?你试试3d

有了首席大臣,Object.prototype便把大部分职责都交给了他,乱七八糟的事儿都交给你吧,没错,当官的都这样。因而,首席大臣便开始了本身辛劳的工做。对象

先构造一个本身的嫡系出来吧,function Function因而诞生了,他即是你声明的全部函数的构造函数,他的__proto__便指向了其构造函数的原型对象Function.prototype,看下面这个例子。

(注:Foo.prototype中的constructor即是构造函数,他与Foo函数是彻底相等的。他指的并非当前Foo函数的构造函数,而是由他构造出来的对象的构造函数。对象/数组自己不具有构
造下一代的能力,所以其便没有prototype原型对象,他的__proto__属性便指向了其构造函数的原型也就是Foo.prototype。而对于任意一个函数的prototype原型对象来讲,其
__proto__都指向了老祖宗Object.prototype

     

Function的制做工做完成了之后,造物主老感受仍是缺点什么东西,仍是不满意,因而一辈子令下,Function你听好了,再给我搞出一个叫Object的东西。Funcion就屁颠屁颠的搞出了二儿子,function Object 

他的原型对象是啥呢,天然就是一国之主,Object.prototype。那么由他构造出来的对象的__proto__便指向的是Object.prototype

造物主仍是以为不满意,又命令Function道,按照造Object的方案,再给我造一个Array... 可是他干的活得多一些....

因而Function便开始了Array的制造过程,为了让他干的活儿多一点,他模仿本身的样子,给Array.prototype加了一些特殊的工具,让Array.prototype.__proto__依然指向了一国之主,Object.prototype

js王国诞生记至此完成....辛苦Function同志....

 

【总结】相信你理清了这些以后,对于js又是一个很大的提高,像zepto、vue等源码的阅读也会更加驾轻就熟。以上都是按照本身的理解而来,文章中各引用类型的诞生顺序值得商榷,可是都是为了可以理解的更加深入。但愿有同窗发现解释的有误的地方还能不吝赐教。

相关文章
相关标签/搜索