若是你此時此刻按下f12 ,就會打開瀏覽器的控制檯;
在控制檯 輸出一個函數:
瀏覽器
就會發現,在ff 函數上掛着兩個屬性:__proto__和protoype函數
__proto__ : 函數也是普通對象,指向Function類上的prototype對象; prototype: 函數的原型;
__proto__屬性對於js初學者來講,最初認識它是經過構造函數;prototype
構造函數生成的實例上有__proto__屬性,指向該構造函數的原型;該 構造函數的原型對象有constructor指向該構造函數;3d
那麼,如今請跟我念:code
js 裏面全部對象都是Object構造函數的實例;
對象
js 裏面全部函數,都是Function構造函數的實例;
blog
既然,全部函數都是Function構造函數的實例,那麼全部函數身上都有__proto__指向Function構造函數的原型對象
原型
同時,全部函數,只要前面有new,就從普通函數變成了構造函數,因此全部函數的身上都有prototype 屬性指向本身的原型
io
如今仍是比較好理解的,那麼,下面請更加大聲的朗讀:構造函數
一切構造函數也是函數,也是Function類的實例
Object類也是構造函數,只要是函數,就是Function類的實例,因此Object類身上的__proto__指向其構造函數(Function類)的原型
那麼,問題來了,Function類的原型也是對象吧,對象就有__proto__吧,那麼這個__proto__指向誰呢?
原型對象的__proto__指向Object類的原型,Object類的原型對象,沒有__proto__屬性
看懂下面這張圖,基本上算是理解了:
總結,js中,函數扮演了三個角色:
一、做爲普通函數,形如 fn() 執行 二、做爲類(構造函數),函數做爲類時,有prototype屬性,指向本身的原型對象;經過new 操做符能夠生成本身的實例(該實例是個對象數據類型),該實例的__proto__指向該類的原型 三、做爲對象,自身的__proto__指向Funtion類的原型,Funtion類的原型的__proto__指向Object類的原型,Object類的原型沒有__proto__;函數做爲對象有本身的私有屬性;