乐趣区

函数的原型链结构

函数原型链

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

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

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

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

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

  • Object.prototype的原型是null

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

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

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

Function 是构造函数,所有的函数是 Function 构造函数的实例,构造函数也是函数,所以所有的构造函数也是 Function 构造函数的实例,所以 Function 即是构造函数,也是实例,所以 Function 是自己的构造函数,是它自己创造了自己

由于 Function 是自己的构造函数也是自己的实例,所以 Function 构造函数中既有 prototype 属性也有 __proto__ 属性。

绘制 Function 与 Object 的关系

  • 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 对象添加一个方法
退出移动版