关于Function和Object两大内置类的爱恨情仇

447 阅读2分钟

我们今天来研究一下关于Function和Object两大内置类的相互关系

假设我们有一个数组arr = [10,20,30];

数组也是对象,所以它内部除了"项"和length以外,还有原型链__proto__,指向的是Array内置数组类的原型prototype

那数组类作为一个对象,也有__proto__原型链,那Array作为一个类也是一个function,所以Array的__proto__指向的是Function.prototype.

同样,函数类也有原型和原型链,那函数Function的prototype自然也指向Function.prototype原型对象,而函数Function也属于Function自己的实例,所以函数Function的__proto__也指向Function.prototype

注:其他值型对象都属于"object",而Function.prototype却属于"function",虽然此原型的类型是一个函数,但是它是一个匿名空函数empty/anonymous,它的相关操作和其他值型对象没有任何区别

那我们说每一个原型链,如果不确定它的原型指向,那么它的__proto__一定是指向Object.prototype, 所以这时该Object这个类出场了!

Object作为一个函数类,它的原型链__proto__自然是指向Function.prototype,而它的原型prototype肯定也是指向的自己的prototype对象

那此时就出现了一个奇怪的现象,Array的prototype的__proto__毫无疑问指向的是Object.Prototype, 可Function.prototype的__proto__也指向的是对象类Object.prototype,而Object本身作为一个函数类它的__proto__原型链指向的是Function.prototype

所以由此得出了一个变态的结论:

每个函数都是Function的实例
所以Function自己也是自己的实例
Function instanceof Function //true

函数类的原型链指向函数类自己的原型
Function.__proto__ === Function.prototype //true

Object作为一个类(一个函数),它是Function的一个实例;
Function虽然是一个函数类,但它也是一个对象,所以他也是Object的一个实例;
Object.__proto__.__proto__ === Object.prototype //true

在js中的任何实例(任何值【除了值类型的值】)最后都可以基于自己的__proto__找到Object.prototype,也就是所有的值都是Object的实例=>万物皆对象。