Object和Function的關係其實屬於原型鏈的知識範疇,若是對於原型鏈、原型繼承還不熟悉的話,能夠戳這邊o( ̄▽ ̄)o瀏覽器
Object、Function和其它對象的關係能夠概括爲下面四點:函數
是否是感受有點繞,下面我會逐點解釋(下面的"一切對象"指除null的其它一切對象):post
下面兩點能夠佐證:prototype
1)一切對象的原型鏈最終都是.... → Object.prototype → null
。例如定義一個num變量var num = 1
,則num的原型鏈爲x → Number.prototype → Object.prototype → null
; 定義一個函數對象fnfunction fn() {}
,則fn的原型鏈爲fn → Function.prototype → Object.prototype → null
;等等...code
2)一切對象都包含有Object的原型方法,Object的原型方法包括了toString、valueOf、hasOwnProperty等等,在js中無論是普通對象,仍是函數對象都擁有這些方法,下面列出了幾個例子,你們能夠自行去舉例驗證:cdn
函數對象包括了Function、Object、Array、String、Number,還有正則對象RegExp、Date對象等等,它們在js中的構造源碼都是function xxx() {[native code]);
,Function其實不只讓咱們用於構造函數,它也充當了函數對象的構造器,甚至它也是本身的構造器。對象
從原型鏈能夠佐證:blog
js中對象.__proto__ === 構造器.prototype
,由此能夠見得它們之間的關係。
疑:Object對象都繼承自Function對象了,而一切對象又都繼承自Object對象,這邊是否是有矛盾,Object對象和Function對象的關係是否是有點♂復♀雜?繼承
答:其實疑問的內容就是上面結論的三四點,它們沒有矛盾,關係也不復雜。原型鏈
.... → Object.prototype → null
,包括Function對象,只是Function的原型鏈稍微繞了一點,Function的原型鏈爲Function → Function.prototype → Object.prototype → null
,它與其它對象的特別之處就在於它的構造器爲本身,即直接繼承了本身,最終繼承於Object,上面的原型鏈能夠在瀏覽器驗證:Object → Function.prototype → Object.prototype → null
,原型鏈又繞回來了,而且跟第一點沒有衝突。能夠說Object和Function是互相繼承的關係。
1)一切對象繼承自Object,Object又繼承自Function,那一切對象是否是都有Function的原型方法?
答:不對,普通對象都沒有Function的原型方法。從咱們所寫原型鏈中能夠看出,Object是繼承自Function,而Object也有Function的原型方法(好比bind),但Object繼承獲得的方法儲存於__proto__
屬性中,普通對象從Object繼承到的原型方法卻在於prototype
屬性中,於是不對。
2)Function對象怎麼那麼怪,本身繼承本身?
答:就是 就是。
Object對象直接繼承自Function對象,一切對象(包括Function對象)直接繼承或最終繼承自Object對象。
(有說得不夠清楚或者錯誤的地方,歡迎拍磚~)