函数的原型链结构

函数原型链

任意的一个函数,都是至关于Function的实例。相似于{}new Object()的关系。函数

  • 函数应该有什么属性?__proto__spa

    • 把函数当作构造函数来看,关注其prototype属性
    • 把函数当作对象来看,关注其__proto__属性
    • 这两个属性的切入点是不同的
  • 函数的构造函数是什么?Function
  • 函数应该继承自Function.prototype
  • Function.prototype继承自Object.prototype

绘制函数的构造原型实例结构

clipboard.png

  • 原型也是对象,因此原型对象中也存在__proto__属性,原型对象的__proto__属性指向Object原型对象

    clipboard.png

  • Object.prototype的原型是null

    clipboard.png

  • Object构造函数是函数,一切函数在Function构造函数面前都是对象prototype

    • Object构造函数是Function构造函数的实例对象
    • Object做为对象是继承自Funtion.prototype的,又Function.prototype继承自Object.prototype

      clipboard.png

绘制Function的构造原型实例的三角形结构

Function是构造函数,全部的函数是Function构造函数的实例,构造函数也是函数,因此全部的构造函数也是Function构造函数的实例,因此Function便是构造函数,也是实例,因此Function是本身的构造函数,是它本身创造了本身code

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对象添加一个方法
相关文章
相关标签/搜索