无梦空间

JavaScript极限编程

导航

JavaScript的OO特性:类与对象

        JavaScript是基于对象的语言,理解并熟悉一些系统提供的对象如:window,document,event等很重要,这也是进行针对浏览器环境编程的主要操纵对象.
        JavaScript大多数时使用的是C式的编程方式,函数充斥了JavaScript编程的整个周期.使用C式的编程方式没什么不好,如果你的应用比较简单的话.但是当应用变的庞大,如当今流行起来的Ajax编程模型,使用纯粹的面向过程式的编程思维已经不够用了,因为这种编程模式的代码复用是很困难,即使你自己能很轻易理解自己的代码,但是别人对C式的函数组织理解还是比较困难的.
        如果没有一门涣然一新的客户端OO语言出现改变这种现状,那么大力挖掘JavaScript这门流行已久的语言,我们将发现新的令人欣喜的诸多特点,完全可以使用JavaScript进行OO类编程.
        我们以声明一个JavaScript类示例,并在实现过程中,与C#语言的写法进行对比.
        我们要设计一个People类,具有三个属性:name,sex,age,并提供一个toString方法.
        在C#里我们怎么写呢?如下:

class People
{
    
public string name = "none";
    
public bool isMan = false;
    
public int age = 0;
    
public People(string name, bool isMan, int age)
    
{
        
this.name = name;
        
this.isMan = isMan;
        
this.age = age;
    }

    
public string toString()
    
{
        
return name + "&" + isMan + "&" + age;
    }

}

        如果你对C#或JAVA/C++比较熟悉,可以发现这个People类的定义是足够简单的了.
        那么在JavaScript中,我们应该怎么做呢?如下:

        //声明People类
        var People = function(name,isMan,age){    //直接用function来声明一个类.
            
this.name = name || "none";         //string 
            this.sex = isMan || false;          //bool
            this.age = age || 0;                //int
            this.toString = function(){
                
return this.name + "&" + this.sex + "&" + this.age;
            }

        }
        好象有点别扭.仔细一看,如People类的name属性,它事先并没有经过声明就可以赋值了.这是由于,JavaScript是针对浏览器环境设计的解释型语言,它必须首先将自身代码字符串传递到客户端才能工作.
        显然,数据量的多少是很关键的(直接影响加载速度和响应能力),因此,正如这里所示,JavaScript的变量可以不事先进行声明即可使用.当然,已经使用的变量名是不重复的,如果再次为同一变量名赋值,系统将自动检测是否已经有此名称的变量,如果有,则给已存在的变量赋值;如果没有,则动态创建该名称的变量.(必须习惯这一点,要谅解JavaScript是运行在客户端浏览器上的,数据量很重要,连带JavaScript舍弃了一些并不涉及到原则性错误的细节,并使JavaScrpipt程序尽量保持短小精悍的命名习惯 :)  )
        在设计好一个类之后,下面就是如何使用它了.
        C#:
        People p = new People("fanrong"true24);
        Console.WriteLine(p.toString());
        JavaScript:
        var p = new People("fanrong",true,24);
        alert(p.toString());   
//display "fanrong&true&24"
        
        这里必须一提的是JavaScript的一个重要特性:JavaScript天然支持函数重载!
        如下所示例:
        var p = new People();   //JavaScript的特点:天生支持函数重载
        alert(p.toString());    //display "none&false&0"
        var p2 = new People("fanrong");
        alert(p2.toString());   
//display "fanrong&false&0"
        var p3 = new People("fanrong",true,24);
        alert(p3.toString());   
//display "fanrong&true&24"
        var p4 = new People("fanrong4",true,24,1);      //超出了默认的参数个数
        alert(p4.toString());   //display "fanrong4&true&24"
        我们在People类中,只定义了一个构造函数,其中声明了可传递三个变量:name,sex,age.
        但在实际应用中,我们可随意为此函数传递不定数量,并不会出错.当然,系统会根据你传递的参数的顺序(顺序很重要)来支持函数内部的处理逻辑.如People类,我们通过:  this.name = name || "none";的方式,表明当没有传递name值时,即name为undefined时,this.name = "none";(这是"||"符号的妙用).
        由于JavaScript函数参数的不严格固定,因此我们用JavaScript编程时,就要与传统的编译型语言函数内部设计有所不同了.在一些必要的情况下,我们最好考虑如果函数没有获取足够的参数,我们需要做一些善后的处理 :)
        下面本例JavaScript的完整代码:
    <script type="text/javascript">
        
//声明People类
        var People = function(name,isMan,age){
            
this.name = name || "none";         //string 
            this.sex = isMan || false;          //bool
            this.age = age || 0;                //int
            this.toString = function(){
                
return this.name + "&" + this.sex + "&" + this.age;
            }

        }

        
var p = new People();   //JavaScript的特点:天生支持函数重载
        alert(p.toString());    //display "none&false&0"
        var p2 = new People("fanrong");
        alert(p2.toString());   
//display "fanrong&false&0"
        var p3 = new People("fanrong",true,24);
        alert(p3.toString());   
//display "fanrong&true&24"
        var p4 = new People("fanrong4",true,24,1);      
        alert(p4.toString());   
//display "fanrong4&true&24"
    </script>

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