深入理解javascript中函數的三個角色

若是你此時此刻按下f12 ,就會打開瀏覽器的控制檯;
在控制檯 輸出一個函數:
瀏覽器

就會發現,在ff 函數上掛着兩個屬性:__proto__和protoype函數

__proto__  : 函數也是普通對象,指向Function類上的prototype對象;
prototype: 函數的原型;

爲何函數身上會有 proto 屬性呢?

__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__;函數做爲對象有本身的私有屬性;

相關文章
相關標籤/搜索