无梦空间

JavaScript极限编程

导航

Function和Object(2)

&

     以下是Atlas中的关于Function和Object的源码,这两者基本构成了整个JavaScript的面向对象编程机制.
    代码如下:
 
   以下开始逐一分析Atlas对Function与Object两大基础对象的扩展,以及如何架构Atlas的OO机制的.
    1)名称空间namespace
    面向对象的一个特点是具有名称空间这个概念.JavaScript没有内建支持此概念,但是,说到底,名称空间也就是一个将一些同名类按功能模块区分的一个"名称"罢了.想在JavaScript中实现"名称空间"这个概念其实相当简单.
    首先让我们来测试几个使用"名称空间"的示例,如下:
     这里我把Atlas的实现"名称空间"的代码复制过来,并单独应用.从代码可知,当把名称空间字符串(以"."分隔)调用Function.registerNamespace方法时,第一行代码"var rootObject = window"是关键所在.所谓"名称空间",其实也是一个实例对象,如这里的"MySpace1"经过注册后,它是第一层"名称空间",看这段代码"rootObject[currentPart] = new Object();",在i为0时,这行代码等价于"window.全局属性 = new Object()".
     一言概之,Atlas实现的"名称空间",其实是一个个"new Object()",是一个个object对象,而"类",测试这些object对象的属性(函数对象),创建实例对象时,就是用"new 名称空间.函数对象(...)".
     顶级的"名称空间"对象是window下的全局对象,顶级"名称空间"下的次级的"名称空间"以及"类",则都是它的不同层次的属性对象.
    从"a.show(typeof(MySpace1)); //MySpace1 is object b.show(typeof(MySpace1.MyClass)); //MySpace1.MyClass is function "这两行代码,我们可以看到,MySpace1是object实例对象,而MySpace1.MyClass则是function函数对象,这里,实例对象的属性竟然可以是"类",这也是JavaScript与其他语言区别很大的地方.    

      2)接口interface
    接口只是某一方面的功能描述,或者说是约束,让继承接口的类必须实现接口定义的属性和方法.    首先让我们来看一段"定义接口"的代码:
    IArray是一个理解上的"接口",单纯从代码上看,它就是一个函数对象.但是通过"registerInterface"后,IArray具备了一些接口的专有属性,具备了"接口"的特征,如"IArray._interface = true"等.(重要的一点:JavaScript是无法实现代码约束性很强的功能,很多东西,都需要编写者从"自觉遵守"的角度去做)
    
    2)抽象类
Function.prototype.registerAbstractClass = function(typeName, baseType) {
     this.registerClass.apply(this, arguments);
     this._abstract = true; //是否是抽象类的标志 return this;
}   

    3)密封类
Function.prototype.registerSealedClass = function(typeName, baseType) {
     this.registerClass.apply(this, arguments); //密封类还是类,需要注册类
     this._sealed = true; //是否密封类的标志 return this;

 
    4)类
    类,如我上节所述,JavaScript中的"类",其实是函数对象,是经typeof(f)返回function类型的对象.
    在JavaScript中创建"类"是很简单的事,只要写一个函数即可,因为函数对象就是"类".写一个"类"容易,但是单纯的JavaScript的"类",不直接支持很多OO特性,如继承\接口实现\调用基类方法等.要将"类"组织管理好,就要下一番工夫了.
以下是Atlas注册一个类的方法

nbsp;

posted on 2006-10-02 11:13  想那风霜雪  阅读(574)  评论(0编辑  收藏  举报