Object是Function的实例,我还想得通,因为Object本身就是函数。但是Function为嘛又是Object的实例呢?
alert(Object instanceof Function);//true
alert(Function instanceof Object);//true
我们都知道,js中的实例对象都有proto属性(隐形的),它指向其构造函数的prototype属性。依据此原理,可以给出如下代码:
Object.__proto__===Function.prototype;//true,这个毫无异议,我支持啊;
Function.__proto__===Object.prototype;//false,这个怎么解释,难道‘Function instanceof Object’仅仅只是一个概念上的骗局?
其实我更想明白javascript内部对此的实现机制是什么,这个从逻辑上来讲,有点纠结啊。在我看来,javascript中的一切都是基于Function构建的。
首先,JS 的基础就是
Object
。js 里面一切都是继承自Object
(除了处于原型链顶端的null
)。先记住,不停强化这个概念
Object
是夏娃,js 的子子孙孙都是她生的。然后在这个基础上继续往后看。先说
instanceof
A instanceof B
是在 A 的原型链里查找 B 的 constructor,找到返回 true,找不到返回 false。再说
Function instanceof Object
前文说了,一切都是继承自
Object
的。Function
是一个对象,所以Function instanceof Object === true
。接着说
Object instanceof Function
function(){}
都是Function
对象的实例,自然任何(function(){}) instanceof Function
的值都是true
。Object
自身是一个构造函数。没错,是函数!函数都是继承自Function
。所以Object instanceof Function === true
。最后说
__proto__
__proto__
是啥。根据定义,__proto__
是该对象(Object)的原型(prototype)的构造函数(constructor)引用。根据定义,我们猜测
但是看了一眼 参考资料1 中的图
尼玛!猜错了!在 JS 设计的过程中,
Object
的__proto__
很神奇地指向了Function.prototype
。所以
而
Function.__proto__
自然而然不等于Object.prototype
。注:
别问我为啥要这样设计,因为 js 他就是这样设计的。
参考资料: