Java学习

java,spring,structs,hibernate,jsf,ireport,jfreechart,jasperreport,tomcat,jboss -----本博客已经搬家了,新的地址是 http://www.javaly.cn 如果有对文章有任何疑问或者有任何不懂的地方,欢迎到www.javaly.cn (Java乐园)指出,我会尽力帮助解决。一起进步

 

js的对像编程

定义类或对象
http://www.iwms.net/n1982c17.aspx

定义类或对象

虽然ECMAScript越来越正规化了,但创建对象的方法却被置之不理。在高级的编程语言(如C#)中,创建对象的方法被明确的定义了。所以不会有太大的分歧。但在脚本语言中创建对象的方法就是多种多样了。
4.1 工厂方式
由于对象的属性可在对象创建后动态定义,所以许多开发者都在初次引入JavaScript时编写类似下面的代码:
Var oCar=new Object();
oCar.color="red";
oCar.doors=4;
oCar.mpg=23;
oCar.showColor=function(){alert(this.color);};
在这段代码中,创建对象car。然后给它设置几个属性:它的颜色是红色,有四个门,每加仑油23英里。最后一个属性是指向函数的指针,意味着该属性其实是个方法。执行这段代码后,就可以使用对象car了。可是要创建多个car实例就麻烦了。
要解决此问题,开发者可以创建并返回特定类型的对象的工厂函数。例如,函数CreateCar()可用于封装前面列出的创建car对象的操作:
Function createCar()
{
Var oTempCar=new Object();
oTempCar.color="red";
oTempCar.doors=4;
oTempCar.mpg=23;
oTempCar.showColor=function(){alert(this.color)};

return oTempCar;
}
Var oCar1=createCar();
Var oCar2=createCar();
这里,前面的所有代码都包含在createCar()函数中,此外还有一行额外的代码,返回Car对象作为函数值。调用此函数时,将创建新对象,并赋予它 所有必要的属性,复制出一个前面说明的car对象。使用该方法,可以容易地创建car对象的两个版本,他们的属性完全一样。当然,还可以修改 creatCar()函数,给它传递各个属性的默认值,而不是赋予属性默认值:
Function createCar(sColor,iDoors,iMpg)
{
Var oTempCar=new Object();
oTempCar.color= sColor;
oTempCar.doors= iDoors;
oTempCar.mpg= iMpg;
oTempCar.showColor=function(){alert(this.color)};
return oTempCar;
}

Var oCar1=createCar("red",4,23);
Var oCar2=createCar("blue",2,26);
oCar1.showColor();      // 输出"red"
oCar2.showColor();      // 输出"blue"
给createCar()函数加上参数,即可为要创建的car对象的color、doors和mpg属性赋值。使这两个对象具有相同的属性,却有不同的属 性值。但这里有个问题:每次调用函数createCar(),都要创建新函数showColor(),意味着每个对象都有自己的showColor()版 本。事实上,每个对象用的都是同一段代码。这样的定义方法还有一个如下的变形:
Function Car(sColor,iDoors,iMpg)
{
this.color= sColor;
this.doors= iDoors;
this.mpg= iMpg;
this.showColor=function(){alert(this.color)};
}
Var oCar1=new Car("red",4,23);
Var oCar2=new Car("blue",2,26);
oCar1.showColor();      // 输出"red"
oCar2.showColor();      // 输出"blue"
这个方法和上一个方法有个一样的缺陷:重复的创建了showColor()函数。为了解决这个缺陷我们可以用下面的方法。
4.2 原型方式
该方法利用了对象的Prototype属性。用空构造函数来设置类名,然后所有的属性和方法都被直接赋予prototype属性:
Function Car()
{}

Car.prototype.color="red";
Car.prototype.doors=4;
Car.prototype.mpg=23;
Car.prototype.showColor=function(){alert(this.color)};
Var oCar1=new Car();
Var oCar2=new Car();
使用这个方法可以解决重复创建showColor()函数,但又会有新的问题,考虑下面的例子:
Function Car()
{}
Car.prototype.color="red";
Car.prototype.doors=4;
Car.prototype.mpg=23;
Car.prototype.drivers=new Array("Mike","Sue");
Car.prototype.showColor=function(){alert(this.color)};

Var oCar1=new Car();
Var oCar2=new Car();

oCar1.drivers.push("Matt");

alert(oCar1.drivers);    // 输出"Mike,Sue,Matt"
alert(oCar2.drivers);    // 输出"Mike,Sue,Matt"
这里,属性drivers是指向Array对象的指针。改变指针指向的内容,所有的实例都会改变。看来这种方法也不可取
4.3 混合方式
这种方式就是用构造函数定义对象的所有非函数属性,用原型方式定义对象的函数属性(方法)。结果所有的函数只创建一次,而每个对象都具有自己的对象属性实例。
Function Car(sColor,iDoors,iMpg)
{
this.color= sColor;
this.doors= iDoors;

this.mpg= iMpg;
Car.drivers=new Array("Mike","Sue");
}
Car.prototype.showColor=function(){alert(this.color)};

Var oCar1=new Car("red",4,23);
Var oCar2=new Car("blue",3,25);

oCar1.drivers.push("Matt");

alert(oCar1.drivers);    // 输出"Mike,Sue,Matt"
alert(oCar2.drivers);    // 输出"Mike,Sue"
这种方式是ECMAScript主要采用的方式,它具有其他方式的特性,却没有它们的缺陷。在实际编程中应用的也是最多了。
另外还有JSON创建方式。其创建的方式如下:
var Car =
{
color: "red",
doors: 4,
mpg: 23,
drivers: [{name: "Mike", age: 20, Married: false}, {name: "Sue", age: 30, Marred: true}],
showColor: function() {alert(this.color)}
};
这种创建对象的方式也比较优雅。可作为Ajax返回的文本,然后用eval()函数将其还原成一个对象。著名的脚本框架JQuery就有专门接收返回文本为JSON对象的异步方法。

posted on 2009-07-09 09:02 找个美女做老婆 阅读(245) 评论(0)  编辑  收藏


只有注册用户登录后才能发表评论。


网站导航:
 

导航

统计

公告

本blog已经搬到新家了, 新家:www.javaly.cn
 http://www.javaly.cn

常用链接

留言簿(6)

随笔档案

文章档案

搜索

最新评论

阅读排行榜

评论排行榜