可以简单认为,JavaScript中所有的"东西"都是对象,而Function和Object是JavaScript的两个基本的核心对象.
   显然,这种说法过于笼统,可以把JavaScript中的对象,分为两种:
             一种是"函数对象"(function),是可以再实例化对象的.所有由function关键字创建的"对象"都是"函数对象",它其实就是JavaScript的"类";
             一种是"实例对象"(object),是不可创建对象的对象.所有由"函数对象"进行实例化操作创建的对象就是"实例对象",它是一般意义上的OO语言中的"对象".
   下面举一个区分这两种"对象"的示例,代码如下:

<script type="text/javascript">
    //创建function函数对象
    var f = function(){  
    }
    f.prototype.show = function(str){
        alert(str);
    }   
    //由函数对象创建实例对象
    var a = new f();
    a.show("kao");                      
    //var b = new a();                  //不能由实例对象创建实例对象.
    
    //分别显示函数对象与实例对象的"对象类型"
    alert(typeof(f));       //function
    alert(typeof(a));       //object        
    
    //可见,函数对象的类型是function;而实例对象的类型是object
</script>

   明白JavaScript中"函数对象"与"实例对象"的不同之后,来看一下上述js代码的一个小地方:prototype.

   prototype原型对象在JavaScript中是一个核心对象,相当关键和重要.这里它被用来定义"类"f的一个方法:show.如果没有"f.prototype.show"这行代码,那么f不过是一个常规的函数,而加了这么一行代码后,可以认为,类f定义了一个常规方法:show.

   和其他面向对象语法的编程模型一样,类的常规方法是可以给它实例化的对象的,因此当实例化对象a之后,a可以直接使用"a.show"来调用方法show.

    

   Function是所有function对象的"基类",就是说Function的所有属性和方法,function类型的对象都可以直接拥有.

   为了说明这一点,请参阅如下代码,并运行之.

<script type="text/javascript">
    Function.prototype.display = function(str){
        alert("Function:"+str);
    }
    var f = function(){  
    }
    f.prototype.show = function(str){
        alert(str);         
    }   
    f.display("f");             //这里,f作为一个对象,调用Function定义的方法display
    var a = new f();
       
    //a.display("x");    //这里会出错       
    a.show("x");                        
</script>

   Function是f的基类,而a是f的对象实例,这里a.display应该能调用,但是实际中会出错. 需要指明一点:function从Function的prototype继承的属性和方法,都自动成为了静态方法,而类的静态方法,该类的实例对象是无法直接调用的.因此,a.display会出错.

   Object是所有对象的"基类",它的范围更广,不管是function对象还是object对象,都可以直接具有Object对象的常规属性和方法.如下所示:

<script type="text/javascript">
    Object.prototype.display = function(str){
        alert("Object:"+str);
    }
    var f = function(){
    }
//    f.prototype.display = function(str){
//        alert("function:"+str);
//    }
    f.display("f");
    var a = new f();       
    a.display("a");                             
</script>


   通过上面的阐述,我想说明的是由Function和Object定义的常规属性和方法(不是静态的),会自动使相应类型的对象具备.不仅Function和Object两个对象如此,如Array,String,Date,Error等也具有相同的特性.如下是扩展Array的clear方法的一个示例:

<script type="text/javascript">

Array.prototype.clear = function() {
        if (this.length > 0) {
            this.splice(0, this.length);
        }
    }       
    var as = new Array();
    as.push(1);                      
    as.push(3);
    alert(as.length);       
    as.clear();
    alert(as.length);       
</script>

   JavaScript内置的Array对象是没有clear方法的,这里我们为Array扩展了一个clear方法,用来清空数组对象内的所有元素.


   需要一提的是,并不是所有系统"类"的扩展都能为对象所具备,静态属性和方法就只能有"类"使用,而不能由对象使用,如下所示:

<script type="text/javascript">
    Object.typeName = "Object";             //静态属性
    Object.display = function(str){         //静态方法
        alert(str);
    }
    Object.prototype.show = function(str){  //常规方法
        alert(str);
    }
       
    var a = new Object();
    //a.display(a.typeName);    //实例对象使用类的静态属性和静态方法将会出错
    a.show("kao");              //使用类的常规方法就没事啦.
</script>

   Atlas正是通过这种JavaScript特性,扩展了JavaScript的很多属性和方法.下一节正式进入Atlas源码分析.