??xml version="1.0" encoding="utf-8" standalone="yes"?>
在JavaScript中可以用function关键字来定义一?#8220;c?#8221;Q如何ؓ(f)cL加成员。在函数内通过this指针引用的变量或者方法都?x)成为类的成员,例如Q?br>
var obj1=new class1();
通过new class1()获得对象obj1Q对象obj1便自动获得了属性p1和方法method1?br>在JavaScript中,function本n的定义就是类的构造函敎ͼl合前面介绍q的对象的性质
以及(qing)new操作W的用法Q下面介l用new创徏对象的过E?br>(1) 当解释器遇到new操作W时便创Z个空对象Q?br>(2) 开始运行class1q个函数Qƈ其中的this指针都指向这个新建的对象Q?br>(3) 因ؓ(f)当给对象不存在的属性赋值时Q解释器׃(x)为对象创属性,例如在class1中,当执行到this.p1=sq条语句Ӟ׃(x)d一个属性p1Qƈ把变量s的Dl它Q这样函数执行就是初始化q个对象的过E,卛_现构造函数的作用Q?br>(4) 当函数执行完后,new操作W就q回初始化后的对象?br> q里的method1每创Z个class1的实例,都会(x)被创Zơ,造成了内存的费。下一节介l另一U类定义的机Ӟ(x)prototype对象Q可以解x造函C定义cL员带来的~点?br> class1.prototype.constructor(); //调用cȝ构造函?br> 一UJavaScriptcȝ设计模式 虽然上面的代码对于类的定义已l清C很多Q但每定义一个属性或Ҏ(gu)Q都需要用一ơclass1.prototypeQ不仅代码体U变大,而且易读性还不够。ؓ(f)了进一步改q,可以使用无类型对象的构造方法来指定prototype对象Q从而实现类的成员定义:(x) 上面的代码用一U很清晰的方式定义了class1Q构造函数直接用cd来实玎ͼ而成员用无cd对象来定义,以列表的方式实现了所有属性和Ҏ(gu)Qƈ且可以在定义的同时初始化属性的倹{这也更象传l意义面向对象语a中类的实现。只是构造函数和cȝ成员定义被分Z两个部分Q这可看成JavaScript中定义类的一U固定模式,q样在用时?x)更加容易理解?br>
通过q整个过E,JavaScript中就实现了面向对象的基本机制。由此可见,在JavaScript中,function的定义实际上是实现一个对象的构造器Q是通过函数来完成的。这U方式的~点是:(x)
?/span>所有的初始化语句、成员定义都攑ֈ一P代码逻辑不够清晰Q不易实现复杂的功能?br>?/span>每创Z个类的实例,都要执行一ơ构造函数。构造函C定义的属性和Ҏ(gu)总被重复的创建,例如Q?/p>
alert("this is a test method");
}
使用prototype对象定义cL?/strong>
上一节介l了cȝ实现机制以及(qing)构造函数的实现Q现在介l另一Uؓ(f)cL加成员的机制Qprototype对象。当new一个functionӞ该对象的成员自动赋l所创徏的对象,例如Q?br>
<!--
//定义一个只有一个属性prop的类
function class1(){
this.prop=1;
}
//使用函数的prototype属性给cd义新成员
class1.prototype.showProp=function(){
alert(this.prop);
}
//创徏class1的一个实?/span>
var obj1=new class1();
//调用通过prototype原型对象定义的showPropҎ(gu)
obj1.showProp();
//-->
</script>
prototype是一个JavaScript对象Q可以ؓ(f)prototype对象d、修攏V删除方法和属性。从而ؓ(f)一个类d成员定义?br>了解了函数的prototype对象Q现在再来看new的执行过E?br>(1) 创徏一个新的对象,q让this指针指向它;
(2) 函数的prototype对象的所有成员都赋给q个新对象;
(3) 执行函数体,对这个对象进行初始化操作Q?br>(4) q回Q?Q中创徏的对象?br>
和上一节介l的new的执行过E相比,多了用prototype来初始化对象的过E,q也和prototype的字面意思相W,它是所对应cȝ实例的原型。这个初始化q程发生在函CQ构造器Q执行之前,所以可以在函数体内部调用prototype中定义的属性和Ҏ(gu)Q例如:(x)
<!--
//定义一个只有一个属性prop的类
function class1(){
this.prop=1;
this.showProp();
}
//使用函数的prototype属性给cd义新成员
class1.prototype.showProp=function(){
alert(this.prop);
}
//创徏class1的一个实?/span>
var obj1=new class1();
//-->
</script>
和上一D代码相比,q里在class1的内部调用了prototype中定义的Ҏ(gu)showPropQ从而在对象的构造过E中弹Z对话框,昄prop属性的gؓ(f)1?br>需要注意,原型对象的定义必d创徏cd例的语句之前Q否则它?yu)不会(x)v作用Q例如:(x)
<!--
//定义一个只有一个属性prop的类
function class1(){
this.prop=1;
this.showProp();
}
//创徏class1的一个实?/span>
var obj1=new class1();
//在创建实例的语句之后使用函数的prototype属性给cd义新成员Q只?x)对后面创徏的对象有?/span>
class1.prototype.showProp=function(){
alert(this.prop);
}
//-->
</script>
q段代码会(x)产生q行旉误,昄对象没有showPropҎ(gu)Q就是因Ҏ(gu)的定义是在实例化一个类的语句之后?br>由此可见Qprototype对象专用于设计类的成员,它是和一个类紧密相关的,除此之外Qprototypeq有一个重要的属性:(x)constructorQ表C对该构造函数的引用Q例如:(x)
alert(1);
}
q段代码q行后将?x)出现对话框Q在上面昄文字“1”Q从而可以看Z个prototype是和一个类的定义紧密相关的。实际上Qclass1.prototype.constructor===class1?/p>
前面已经介绍了如何定义一个类Q如何初始化一个类的实例,且类可以在function定义的函C中添加成员,又可以用prototype定义cȝ成员Q编E的代码昑־混ؕ。如何以一U清晰的方式来定义类呢?下面l出了一U类的实现模式?br>在JavaScript中,׃对象灉|的性质Q在构造函C也可以ؓ(f)cL加成员,在增加灵zL的同时Q也增加了代码的复杂度。ؓ(f)了提高代码的可读性和开发效率,可以采用q种定义成员的方式,而用prototype对象来替代,q样function的定义就是类的构造函敎ͼW合传统意义cȝ实现Q类名和构造函数名是相同的。例如:(x)
//构造函?/span>
}
//成员定义
class1.prototype.someProperty="sample";
class1.prototype.someMethod=function(){
//Ҏ(gu)实现代码
}
function class1(){
//构造函?/span>
}
//通过指定prototype对象来实现类的成员定?/span>
class1.prototype={
someProperty:"sample",
someMethod:function(){
//Ҏ(gu)代码
},
…//其他属性和Ҏ(gu).
}
注意Q?/span>在一个类的成员之间互相引用,必须通过this指针来进行,例如在上面例子中的someMethodҎ(gu)中,如果要用属性somePropertyQ必通过this.someProperty的Ş式,因ؓ(f)在JavaScript中每个属性和Ҏ(gu)都是独立的,它们通过this指针联系在一个对象上?/p>
]]>
我们使用AJAX发送请求,有时候需要传递参敎ͼ其多个参C间都是以"&"隔开?br>
在要求传的参数比较多的情况下Q可以将参数-值先一个一个的存在Array里面Q然后用joinҎ(gu)转换为字W串?br>
var aParam = new Array();
// 参数
var param1 = "name=x29";
.
.
.
var paramN = "paramName=value";
// 参数存入数l当?/span>
aParam.push(param1);
.
.
aParam.push(paramN);
// 数l{换成字符Ԍq作为参C?/span>
xmlHttp.send(aParam.join("&"));
]]>
#A tr
{
background-color
:
expression(rowIndex%2?'#ffffcc':'#ffffff')
}
</STYLE>
效果如下Q?/p>
1
2
3
4
]]>