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;
}
}
{
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是针对浏览器环境设计的解释型语言,它必须首先将自身代码字符串传递到客户端才能工作.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;
}
}
显然,数据量的多少是很关键的(直接影响加载速度和响应能力),因此,正如这里所示,JavaScript的变量可以不事先进行声明即可使用.当然,已经使用的变量名是不重复的,如果再次为同一变量名赋值,系统将自动检测是否已经有此名称的变量,如果有,则给已存在的变量赋值;如果没有,则动态创建该名称的变量.(必须习惯这一点,要谅解JavaScript是运行在客户端浏览器上的,数据量很重要,连带JavaScript舍弃了一些并不涉及到原则性错误的细节,并使JavaScrpipt程序尽量保持短小精悍的命名习惯 :) )
在设计好一个类之后,下面就是如何使用它了.
C#:
People p = new People("fanrong", true, 24);
Console.WriteLine(p.toString());
JavaScript:Console.WriteLine(p.toString());
var p = new People("fanrong",true,24);
alert(p.toString()); //display "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.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类,我们通过: 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>
//声明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>