完全搞懂Object和Function的關係

Object和Function的關係其實屬於原型鏈的知識範疇,若是對於原型鏈、原型繼承還不熟悉的話,能夠戳這邊o( ̄▽ ̄)o瀏覽器

Object、Function和其它對象的關係能夠概括爲下面四點:函數

  1. 一切對象都最終繼承自Object對象,Object對象直接繼承自根源對象null
  2. 一切函數對象(包括Object對象)都直接繼承自Function對象
  3. Object對象直接繼承自Function對象
  4. Function對象直接繼承本身,最終繼承自Object對象

是否是感受有點繞,下面我會逐點解釋(下面的"一切對象"指除null的其它一切對象):post

1. 一切對象都最終繼承自Object對象,Object對象直接繼承自根源對象null

下面兩點能夠佐證: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

2. 一切函數對象(包括Object對象)都直接繼承自Function對象

函數對象包括了Function、Object、Array、String、Number,還有正則對象RegExp、Date對象等等,它們在js中的構造源碼都是function xxx() {[native code]);,Function其實不只讓咱們用於構造函數,它也充當了函數對象的構造器,甚至它也是本身的構造器。對象

從原型鏈能夠佐證:blog

js中 對象.__proto__ === 構造器.prototype,由此能夠見得它們之間的關係。

疑:Object對象都繼承自Function對象了,而一切對象又都繼承自Object對象,這邊是否是有矛盾,Object對象和Function對象的關係是否是有點♂復♀雜?繼承

答:其實疑問的內容就是上面結論的三四點,它們沒有矛盾,關係也不復雜。原型鏈

  1. 一切對象都繼承自Object對象是由於一切對象的原型鏈最終都是.... → Object.prototype → null,包括Function對象,只是Function的原型鏈稍微繞了一點,Function的原型鏈爲Function → Function.prototype → Object.prototype → null,它與其它對象的特別之處就在於它的構造器爲本身,即直接繼承了本身,最終繼承於Object,上面的原型鏈能夠在瀏覽器驗證:

2. Object繼承自Function,Object的原型鏈爲 Object → Function.prototype → Object.prototype → null,原型鏈又繞回來了,而且跟第一點沒有衝突。能夠說Object和Function是互相繼承的關係。

三、4點的解答在第2點中

疑問

1)一切對象繼承自Object,Object又繼承自Function,那一切對象是否是都有Function的原型方法?

答:不對,普通對象都沒有Function的原型方法。從咱們所寫原型鏈中能夠看出,Object是繼承自Function,而Object也有Function的原型方法(好比bind),但Object繼承獲得的方法儲存於__proto__屬性中,普通對象從Object繼承到的原型方法卻在於prototype屬性中,於是不對。

2)Function對象怎麼那麼怪,本身繼承本身?

答:就是 就是。

總結

Object對象直接繼承自Function對象,一切對象(包括Function對象)直接繼承或最終繼承自Object對象。

(有說得不夠清楚或者錯誤的地方,歡迎拍磚~)

相關文章
相關標籤/搜索