JS 原型鏈

   在正文以前,首先要知道兩點,函數

  一、__proto__是每一個js 對象的內置屬性,而prototype 是函數的內置屬性,也是一個對象。spa

  二、所謂原型,指的就是每一個函數對象的prototype屬性。prototype

function A(){
}
var a = new A();

  A是一個函數,因此A.prototype(A的原型)是存在的(這個指向的是一個對象),而a.prototype 是不存在的,如下開始正文。3d

  帶着以上幾個問題,開始向下扯這條原型鏈。code

 var a = new A();

  因爲a是由new A 產生的,因此a和A之間應該有個什麼東西保持一下關係,怎麼辦呢,那麼咱們就給a添加一個__proto__屬性吧,這個東西怎麼用呢?把它指向A自己?對象

  A確定不肯意,A以爲:你是由我產生的,還想把我變成你的一個屬性?沒大沒小的,不能這麼幹,因而A想了一個辦法,你就指向個人原型(prototype)屬性吧,之後你出去混只要說你的__proto__ 和個人原型同樣,證實你就是個人小弟,是個人一個實例。因而就有了,blog

  

a.__proto__ == A.prototype //true

 有的人可能就會問,A也是一個對象,他也應該有本身的__proto__的吧,A的老大是誰?原型鏈

 這個問題問得好,要搞明白這個,先得了解A 是怎麼產生的,原型

  

function A(){
}

  找到了,就是這麼來的,A 是function 定義出來的,貌似不是new 出來的啊,咋找呢?其實這個function a(){}只是一個語法糖而已,實際上等價於博客

var A = new Function()

原來如此,覺得穿了個馬甲我就不認識你了?這樣一來很清楚了,

A.__proto__ == Function.prototype //true

   好奇的同窗又會問了,A的原型(A.prototype)說了半天,他是什麼呢??這位同窗,你怎麼這麼多問題?看在你骨骼驚奇,咱們就來研究研究,向萬能的控制檯問一問。

看見了吧,A.prototype是一個Object,自帶constructor屬性,這個constructor指向哪裏?

原來是他本身,這個constructor咱們叫他構造函數。指向的是函數自己。

 那麼A.prototype.__proto__又指向啥啊?哇塞,好饒人哦!!!

一樣,搞清楚__proto__是啥,就得知道A.protoype是啥,從哪裏來,顯然,A.prototype是一個對象,對象的老大是誰,off course !!! 全部對象的老大都是Object ,實際上全部的對象都是new Object()出來的,你覺得var B = {} 這種不是?其實也是個語法糖而已。其實是:

var B = new Object();

 

 因此又有

A.prototype.__proto__ == Object.prototype  // true

(看到這裏,一、2,問題應該有些瞭解了吧)

  聰明的小朋友可能發現了,new Object() 這個是說明Object 也是一個函數吧!恭喜答對,明年就你當班長了!

既然也是一個函數,因此有:

Object.__proto__ == Function.prototype //true

那麼 Function 是誰產生的呢?想起來沒new Function()這種寫法,因此Function 自己也是一個函數,因此有

Function.__proto__ == Function.prototype

握草,有點懵逼!!!(此處應有十臉懵逼表情包),雖然他們的關係有點亂,可是這就是他們,暈了沒,暈的話下面還有哦,

愛問問題的小朋友又提問啦!驚喜不?Function.prototype.__proto__是誰?

顯然,Function.prototype 是一個對象,因此,

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

好吧,我保證這是最後一個問題!!Object.prototype.__proto__是誰???

  老師我知道!聰明的小朋友可能會以爲,Object.prototype也是一個對象,因此應該就是Object.prototype !,錯!

是null,記住了哦!

 

 

 

 

 

 

 

 

注:本文出自博客園http://www.cnblogs.com/mdengcc/ 轉載請註明出處。

相關文章
相關標籤/搜索