无梦空间

JavaScript极限编程

导航

Function和Object(1)

   可以简单认为,JavaScript中所有的"东西"都是对象,而Function和Object是JavaScript的两个基本的核心对象.
   显然,这种说法过于笼统,可以把JavaScript中的对象,分为两种:
             一种是"函数对象"(function),是可以再实例化对象的.所有由function关键字创建的"对象"都是"函数对象",它其实就是JavaScript的"类";
             一种是"实例对象"(object),是不可创建对象的对象.所有由"函数对象"进行实例化操作创建的对象就是"实例对象",它是一般意义上的OO语言中的"对象".
   下面举一个区分这两种"对象"的示例,代码如下:
   明白JavaScript中"函数对象"与"实例对象"的不同之后,来看一下上述js代码的一个小地方:prototype.
   prototype原型对象在JavaScript中是一个核心对象,相当关键和重要.这里它被用来定义"类"f的一个方法:show.如果没有"f.prototype.show"这行代码,那么f不过是一个常规的函数,而加了这么一行代码后,可以认为,类f定义了一个常规方法:show.
   和其他面向对象语法的编程模型一样,类的常规方法是可以给它实例化的对象的,因此当实例化对象a之后,a可以直接使用"a.show"来调用方法show.
    
   Function是所有function对象的"基类",就是说Function的所有属性和方法,function类型的对象都可以直接拥有.
   为了说明这一点,请参阅如下代码,并运行之.
 
   Function是f的基类,而a是f的对象实例,这里a.display应该能调用,但是实际中会出错. 需要指明一点:function从Function的prototype继承的属性和方法,都自动成为了静态方法,而类的静态方法,该类的实例对象是无法直接调用的.因此,a.display会出错.
   Object是所有对象的"基类",它的范围更广,不管是function对象还是object对象,都可以直接具有Object对象的常规属性和方法.如下所示:
 
   
   通过上面的阐述,我想说明的是由Function和Object定义的常规属性和方法(不是静态的),会自动使相应类型的对象具备.不仅Function和Object两个对象如此,如Array,String,Date,Error等也具有相同的特性.如下是扩展Array的clear方法的一个示例:
 
   JavaScript内置的Array对象是没有clear方法的,这里我们为Array扩展了一个clear方法,用来清空数组对象内的所有元素.

   需要一提的是,并不是所有系统"类"的扩展都能为对象所具备,静态属性和方法就只能有"类"使用,而不能由对象使用,如下所示:
 
   Atlas正是通过这种JavaScript特性,扩展了JavaScript的很多属性和方法.下一节正式进入Atlas源码分析.

posted on 2006-10-01 17:42  想那风霜雪  阅读(631)  评论(1编辑  收藏  举报