关于Function的原型链问题

194 阅读1分钟

在我看来Function在原型链中是一个比较特殊的存在,我觉得它应该是原型链中的特殊分支。理解清楚了它,有助于帮助我们更全面的理解原型链。

1. Function是一切函数的构造函数

我们大家都知道要创建一个函数的话可以使用下面这种方式:

let f = function(x, y){
  return x+y
}
// 或者是
function a (){}

但是,我也是最近才注意到实际上这种方式是函数的字面量方式,实际上这个过程是进行了下面的操作:

let f = new Function('x','y','return x+y')

构造函数Function接收三个参数,除了最后一个参数是函数体以外,其余参数都是函数的参数。 这种方式的写法,清晰的告诉了我们,我们创建的函数实际上是构造函数Function的一个对象,所以:

f.__proto__ === Function.prototype  //  => true

在js中的内置函数对象也是相同的原理,String(),Number(),Array(),Math()等函数也都是有Function构造函数创建的,他们的__proto__属性也都是指向Function.prototype的。

String.__proto__ === Function.prototype     // => true
Number.__proto__ === Function.prototype     // => true
// 下面这个需要引起特别的注意!!!!
Object.__proto__ === Function.prototype     // => true

结论: Function是一切函数的构造函数,包括Object本身,所以有下面这个公式就可以成立了所有函数的.__ proto __ === Function.prototype

2. Function 的__ proto __

在测试过程中我们还发现一个很有意思的现象

Function.__proto__ === Function.prototype  // => true

这说明Function函数也是由Function构造的?下面我们可以得出一个比较拗口的结论:

  1. Function 作为一个实例对象,它有__ proto __属性指向他的原型对象;
  2. Function作为一个函数,他有prototype属性指向他的原型