首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 网站开发 > JavaScript >

(转)javascript中的Function跟Object

2012-10-27 
(转)javascript中的Function和Object原文地址:http://blog.csdn.net/tom_221x/archive/2010/02/22/5316675

(转)javascript中的Function和Object

原文地址:http://blog.csdn.net/tom_221x/archive/2010/02/22/5316675.aspx

在javascript中所有的对象都继承自Object原型,而Function又充当了对象的构造器,那么Funtion和Object到底有着什麽样的关系呢 ?

首先,一切都是对象。

  1. alert(Object?instanceof?Object);?//?true
  2. alert(Function?instanceof?Object);//?true
  3. alert(Object?instanceof?Function);//?true
  4. alert(Function?instanceof?Function);//?true

由此可见,Object继承自己,Funtion继承自己,Object和Function互相是继承对方,也就是说Object和Function都既是函数也是对象。这一点很特别。所有的函数都是对象,可是并不是所有的对象都是函数。证明如下:

  1. function?foo(){};
  2. alert(foo?instanceof?Function);?//?true
  3. alert(foo?instanceof?Object);?//?true
  4. alert(new?foo()?instanceof?Function);?//?false

我们看到由new + function的构造器实例化出来的对象不是函数,仅仅是Object的子类。接下来,我们会想所有的对象都有一个Function的构造器存储在原型链的constructor属性中,那么Object的构造器是什麽呢? 证明:

  1. alert(Object.constructor);?//?function?Function(){?[native?code]?}
  2. 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啊,我们来验证一下:

  1. alert(new?Function()?instanceof?Object);?//?true
  2. alert(Object?instanceof?new?Function());//?false
  3. alert(typeof?new?Function());//?function
  4. alert(typeof?Object);//?function??

其实new Function();将产生一个匿名函数,由于Function是顶级函数所以可以产生自定义函数,我们可以把所有的函数看作Function的子类。但所有的一切包括函数都是Object的子类这点是不变的,也得到了体现。typeof Object的结果说明Object也是一个函数。继续做实验:

  1. alert(new?Object().constructor);?//?function?Object(){?[native?code]?}
  • 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(){...};

    1. alert(Array?instanceof?Function)?//?true
    2. alert(String?instanceof?Function)?//?true
    3. alert(Number?instanceof?Function)?//?true
    4. alert(Array.constructor)?//?function?Function(){?[native?code]?}
    5. alert(String.constructor)?//?function?Function(){?[native?code]?}
    6. alert(Number.constructor)?//?function?Function(){?[native?code]?}

    ?

    总结一下,像内置的函数或说对象把如:Object,String,Array等等和自定义的function关键字定义的函数,都是Function的子类。new Function()相当于function关键字定义。这里可以引出,Function.prototype原型链上的属性所有函数共享,Object.prototype原型链上的属性所有对象共享。

  • 热点排行