函数原型链

任意的一个函数,都是相当于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对象添加一个方法

blob
45 声望2 粉丝

A man who concentrates on coding.


« 上一篇
原型链