函數的原型鏈結構

函數原型鏈

任意的一個函數,都是相當於Function的實例。類似於{}new Object()的關係。

  • 函數應該有什麼屬性?__proto__

    • 把函數當做構造函數來看,關注其prototype屬性
    • 把函數當做對象來看,關注其__proto__屬性
    • 這兩個屬性的切入點是不一樣的
  • 函數的構造函數是什麼?Function
  • 函數應該繼承自Function.prototype
  • Function.prototype繼承自Object.prototype

繪製函數的構造原型實例結構

clipboard.png

  • 原型也是對象,所以原型對象中也存在__proto__屬性,原型對象的__proto__屬性指向Object原型對象

    clipboard.png

  • Object.prototype的原型是null

    clipboard.png

  • Object構造函數是函數,一切函數在Function構造函數面前都是對象

    • Object構造函數是Function構造函數的實例對象
    • Object作爲對象是繼承自Funtion.prototype的,又Function.prototype繼承自Object.prototype

      clipboard.png

繪製Function的構造原型實例的三角形結構

Function是構造函數,所有的函數是Function構造函數的實例,構造函數也是函數,所以所有的構造函數也是Function構造函數的實例,所以Function即是構造函數,也是實例,所以Function是自己的構造函數,是它自己創造了自己

clipboard.png

由於Function是自己的構造函數也是自己的實例,所以Function構造函數中既有prototype屬性也有__proto__屬性。

繪製Function與Object的關係

clipboard.png

  • Function構造函數的prototype屬性指向Function.prototype原型對象,Function.prototype原型對象的原型是Object原型對象
  • Object構造函數的構造函數是Function構造函數,也就是Function構造函數實例化了Object構造函數,所以Object構造函數作爲對象來說,它本身也有__proto__屬性,指向了Function.prototype原型對象(曲線)
  • 在JavaScript中,最牛的Function構造函數(函數的老大)的原型對象都要繼承自Object原型對象;最牛的Object構造函數(對象的老大)都是由Function構造函數創建出來的

結論

  • 在JavaScript中任何對象的老祖宗就是Object.prototype
  • 在JavaScript中任何函數的老祖宗就是Function.prototype
  • 由於Function.prototype繼承自Object.prototype,所以任何函數的老祖宗也是Object.prototype(此條結論是推導出來的,主要記上面兩條結論)

規則雜談

  • 如果在代碼中希望給所有的對象都提供一個方法,那麼就給Object.prototype對象添加一個方法
  • 如果希望給所有的函數都提供一個方法,那麼就給Function.prototype對象添加一個方法
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章