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