前两天我又试图顺着__proto__和prototype寻找JavaScript宇宙的本源,最后还是不出意料的疯了。

我没疯,经过无数次的测试,我偶然发现了这样一个令人奇怪的现象:

在chrome控制台中, Function.__proto__ === Function.prototype返回的是true,这就引发了我的思考。

function后面的括号 function____function后面的括号

思考了两三天,又刷了一遍MDN相关部分,有了新的收获。

Function,从小往大说,应该是:构造函数——函数——对象。

1、Function是一个构造函数,通过new调用可以生成函数对象,即我们一般自定义的那种函数。所以Fucntion这个构造函数的prototype是所有函数的__proto__,有call, apply等方法。下图证实了这个说法:

function后面的括号 function____函数对象_02

 

2、Function是一个函数,因为构造函数是一种特殊的函数(可通过new调用)。既然它是一个函数,那么按照上面的说法【Fucntion这个构造函数的prototype是所有函数的__proto__】,就有

Function.__proto__ === Function.prototype。在我之前的理解中,形如 a.__proto__ === b.prototype 的情况成立,几乎只有一种可能,那就是:b为构造函数, a是b的实例。把这个可能代入到这里,就是Function是Function的实例,先有Function才有Function,显然不是这样的。所以,Function并不是通过构造函数Function创建的,JavaScript的宇宙中也没有哪个对象必须通过构造函数创建。而且构造函数这种东西在JS里本来就很别扭,人们总说ES6的class是向Java、C++程序员妥协,我觉得可能大写字母开头的构造函数也是这样的妥协吧。Function这个内置的函数/构造函数有什么用呢?有人用它来创建函数吗?可能它目前唯一的作用就是挂着所有函数对象的prototype。往大了说,所有的构造函数都是为了让那一类实例对象有个地方好找它们的原型,顺便骗骗Java程序员,哈哈。

 

3、Function是JS的一个内置对象。之前我对MDN左侧目录的【内置对象】四个字颇有微词,因为在我相信中JS内置的无非是Object、Number、Array等构造函数,叫【内置构造函数】不是更好?现在我又想想,一句妙语脱口而出:这世界上根本就没有食神,或者说人人都是食神