共计 1255 个字符,预计需要花费 4 分钟才能阅读完成。
函数原型链
任意的一个函数,都是相当于 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
对象添加一个方法
正文完
发表至: javascript
2019-09-21