原文地址:http://blog.csdn.net/tom_221x/archive/2010/02/22/5316675.aspx
在javascript中所有的对象都继承自Object原型,而Function又充当了对象的构造器,那么Funtion和Object到底有着什麽样的关系呢 ?
首先,一切都是对象。
- alert(Object?instanceof?Object);?//?true
- alert(Function?instanceof?Object);//?true
- alert(Object?instanceof?Function);//?true
- alert(Function?instanceof?Function);//?true
由此可见,Object继承自己,Funtion继承自己,Object和Function互相是继承对方,也就是说Object和Function都既是函数也是对象。这一点很特别。所有的函数都是对象,可是并不是所有的对象都是函数。证明如下:
- function?foo(){};
- alert(foo?instanceof?Function);?//?true
- alert(foo?instanceof?Object);?//?true
- alert(new?foo()?instanceof?Function);?//?false
我们看到由new + function的构造器实例化出来的对象不是函数,仅仅是Object的子类。接下来,我们会想所有的对象都有一个Function的构造器存储在原型链的constructor属性中,那么Object的构造器是什麽呢? 证明:
- alert(Object.constructor);?//?function?Function(){?[native?code]?}
- alert(Function.constructor);?//?function?Function(){?[native?code]?}
由此我们可以确定Object是由Function这个函数为原型的,而Function是由它自己为原型的。Function函数是由native code构成的,我们不用去深究了。存在function Function(){...}的定义,我们明白了Function其实就是函数指针,也看作函数变量。就相当于function foo(){}中的foo。连Object的构造器都是指向Function的,可以想象Function是一个顶级的函数定义,大大的区别于自定义的如function foo(){}这样的函数定义。
?
看这样一个语句,new Function();以Function为原型来实例化一个对象,按照刚才Object.constructor 为 functon Function(){}来说,new Function()产生的对象应该是一个Object啊,我们来验证一下:
- alert(new?Function()?instanceof?Object);?//?true
- alert(Object?instanceof?new?Function());//?false
- alert(typeof?new?Function());//?function
- alert(typeof?Object);//?function??
其实new Function();将产生一个匿名函数,由于Function是顶级函数所以可以产生自定义函数,我们可以把所有的函数看作Function的子类。但所有的一切包括函数都是Object的子类这点是不变的,也得到了体现。typeof Object的结果说明Object也是一个函数。继续做实验:
- alert(new?Object().constructor);?//?function?Object(){?[native?code]?}
拓展一下,由Object我们会想到Array,Number,String等这些内置对象。有理由相信这些都是Object的子类。如下:
- alert(Array?instanceof?Object)?//?true
- alert(String?instanceof?Object)?//?true
- alert(Number?instanceof?Object)?//?true
- alert(Object?instanceof?Array)?//?false
- alert(Object?instanceof?String)?//?false
- alert(Object?instanceof?Number)?//?false?
当然他们也都会有Object的特性就像魔鬼和撒旦的关系一样,也是Function的子类,由Function构造。那么有Array,String,Number构造的对像如:new Array();new Number();new String()的构造器是function Array(){...};function String(){...};function Number(){...};
- alert(Array?instanceof?Function)?//?true
- alert(String?instanceof?Function)?//?true
- alert(Number?instanceof?Function)?//?true
- alert(Array.constructor)?//?function?Function(){?[native?code]?}
- alert(String.constructor)?//?function?Function(){?[native?code]?}
- alert(Number.constructor)?//?function?Function(){?[native?code]?}
?
总结一下,像内置的函数或说对象把如:Object,String,Array等等和自定义的function关键字定义的函数,都是Function的子类。new Function()相当于function关键字定义。这里可以引出,Function.prototype原型链上的属性所有函数共享,Object.prototype原型链上的属性所有对象共享。