事情得從一個chrome控制檯中的無心打印提及。javascript
衆所周知,js共六種數據類型,string、number、undefined、boolean、object、null。固然javascript還準備了引用類型,他們都是object對象構造而來,以下圖所示的Function、Array、Date...vue
話說到這兒,Array instanceof Object ....這些天然好理解,那麼Array instanceof Function這他媽又是什麼鬼?那就讓咱們來探索一番~java
關係圖以下,讓咱們細細剖析一下chrome
首先,你要明白一個全天下人都明白的知識點數組
事情的誕生都源於一個叫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等源碼的閱讀也會更加駕輕就熟。以上都是按照本身的理解而來,文章中各引用類型的誕生順序值得商榷,可是都是爲了可以理解的更加深入。但願有同窗發現解釋的有誤的地方還能不吝賜教。