一、Function()与Object()的关系图:
1、 Object的constructor指向Function
2、 Object的__proto__(firefox和chrome下存在,指向其父类的prototype)属性以及Function的__proto__属性和Function的prototype均指向同一个对象(firebug中显示为function(),chrome中显示为function Empty() {}),不管怎样,这三个指的是同一个对象。
3、 Function的prototype事实上也是Object的实例。因此prototype的__proto__指向Object的prototype。
4、 Object的prototype的__proto__属性为空,因此,虽然通过firebug可以看到Object.prototype为Object{ },但是通过Object.prototype instanceof Object返回为false。(个人觉得Object的prototype是整个js体系的源头)。
二、为什么Object instanceof Function为true,同时Function instanceof Object也为true?
首先得明白instanceof的原理,还是举例说明一下这个问题:
function A(){}
var a = new A();
大家应该都知道a instanceof A返回true,同时a instanceof Object返回也是true。其实其执行的过程是在a的整个原型链上去查找是否存在A.prototype,如果存在则返回true,否则返回false。
所以这样就比较好理解了,因为Object的原型链上存在Function.prototype(Object.__proto__===Function.prototype),所以Objectinstanceof Function返回true,同时Function.prototype.__proto__指向Object的prototype属性,自然返回的也是true。并且这也可以理解为什么Object.prototypeinstanceof Object返回为false了。
也正因为如此,在javascript中,所有的对象instanceof object均反回true。因为对象最终都通过new+构造函数生成(字面量产生对象的方式,实质上是等同于new Object())。而任何构造函数的产生本质上是通过new Function(…)产生。因此,不管通过new Object()还是通过其他构造函数产生的对象,在其原型链上一定能找到Object.prototype,所以必然都是Object的实例。
三、为什么这么设计?
个人觉得:
1、从函数的角度来说,函数在程序中的作用我想大家都知道,任何一门程序语言不可能没有函数的存在,所以Function是必须存在的。
2、从面向对象的角度来说,javascript中所有的东西都可以看做是对象,因此任何构造函数,包括Function和Object本身都是对象,因此,在javascript中也没有提到类的概念。
3、通过Function与Object的结合,构成了javascript强大而灵活的基于对象的函数式编程模式。