以一个最简单的例子把OO的JavaScript说明白

来源:百度文库 编辑:神马文学网 时间:2024/10/04 14:04:07

以一个最简单的例子把OO的JavaScript说明白<http://blog.csdn.net/calvinxiu/archive/2005/05/20/377097.aspx>

OO的JavaScript并不高深,麻烦就麻烦在google出来的国人介绍文章经常罗罗嗦嗦,而且之间的说法还各有不同,摆在一起就让人看了头大。
这里重拾简单主义,以一个最简单的例子把OO Javascript说明白。

*1.一个颇为精简的例子*

*只需理解三个关键字:
*第一个是*function *,JS世界里Class的定义用"function",function里面的内容就是构造函数的内容。

第二个是*this*指针,代表调用这个函数的对象。

第三个是*prototype*,用它来定义成员函数, 比较规范和保险。

//定义Circle类,拥有成员变量r,常量PI和计算面积的成员函数area()
function Circle(radius)
{
    this.r = radius;
}

Circle.PI = 3.14159;
Circle.prototype.area = function(  ) {return Circle.PI * this.r * this.r;}

//使用Circle类
var c = new Circle(1.0);
alert(c.area());

另外成员函数定义还可以写成这样:

function compute_area(){return Circle.PI * this.r * this.r;}
Circle.prototype.area=compute_area;

*2.继承*

*注意两点*
1.定义继承关系 ChildCircle.prototype=new Circle(0); 其中0是占位用的
2.调用父类的构造函数
     this.base=Circle;
     this.base(radius);

//定义ChildCircle子类
function ChildCircle(radius)
{
     this.base=Circle;
     this.base(radius);

}

ChildCircle.prototype=new Circle(0);
function Circle_max(a,b)
{
    if (a.r > b.r) return a;

    else return b;
}

ChildCircle.max = Circle_max;

//使用ChildCircle子类
var c = new ChildCircle(1);
var d = new ChildCircle(2);
var bigger = d.max(c,d);
alert(bigger.area());

*3.var式定义*
JS还支持一种var Circle={raidus:1.0,PI:3.1415}的形式,语法就如CSS的定义。
因此如果Circle只有一个实例,下面的定义方式更简洁:

var newCircle=
{
r:1.0,
PI:3.1415,
area: function(){ return this.PI * this.r * this.r;}
};

alert(newCircle.area());

BTW.吃饱了撑着可以看看Rails带的OO Javascript库--Prototype <http://prototype.conio.net/>
其实,Javascript现在的语法真的不适合那么别扭的写成OO模式....

Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=377097
 [点击此处收藏本文 ]   江南白衣发表于 2005年05月20日 19:57:00

  errorter 发表于2005-05-21 14:31:00  IP: 61.186.252.*
呵 醍醐灌顶
漂亮极了

 cedarjava 发表于2005-05-23 13:53:00  IP: 61.186.252.*
我对javascript有一些了解,但是对其中的oo概念,总是有些模糊,因为它使我想到java的oo,多态作为oo的一个特性,在javavascrip­t类构造器张可以体现出来,但是其中方法怎么不可以重载呢?

 GoADPASS 发表于2005-05-24 15:17:00  IP: 61.186.252.*
什么叫占位符???

 calvin 发表于2005-05-26 00:25:00  IP: 61.186.252.*
占位符就是如果同时有如下函数
function Circle()
function Circle(i)
function Circle(i,j)

new Circle(0)表明调用的是function Cricle(i)

 Larlf 发表于2005-05-26 12:44:00  IP: 61.186.252.*
没有看出引入prototype有什么太大的好处。
使用占位符也有较大的问题:如果父类中有方法使用到构造方法传入的参数怎么办?

 xx 发表于2005-05-26 18:42:00  IP: 61.186.252.*
如何获得子类集成过来的父类的变量???

 xx 发表于2005-05-26 18:45:00  IP: 61.186.252.*
//定义ChildCircle子类
function ChildCircle(radius) {
this.base=Circle;
this.base(radius);
}

ChildCircle.prototype=new Circle(0);
ChildCircle.prototype.getGirth = function () {
return 2 * this.r * this.PI ;//如何获得子类集成过来的父类的变量???

}

如何在子类里获得父类的变量的复本r
this.r是错的,this.base.r也是错的

 ynyangtao 发表于2005-05-28 20:38:00  IP: 61.186.252.*
其实prototype就相当于java里的static了,你说java缺少static行吗?

 vv 发表于2005-05-30 12:55:00  IP: 61.186.252.*
javascript太弱了,用他来OOP感觉呕心呖血

 自由的飞碟 发表于2005-05-31 09:50:00  IP:
TrackBack来自《以一个最简单的例子把OO的JavaScript说明白
》<http://www.donews.net/z954134/archive/2005/05/31/406070.aspx>

Ping Back来自:www.donews.net

 aa 发表于2005-06-06 14:27:00  IP: 61.186.252.*
js高手可不是这样写的.

 高温接近开关 <http://www.5118.com/> 发表于2005-06-29 16:47:00  IP: 61.186.252.*
真系不是普通的难

 yzsin 发表于2005-08-26 09:32:00  IP: 211.100.4.*
javascript的类定义太不清晰了,与java要差太离谱了, vbscript的类定义还是比较清晰,好像只是不支持继承,语法与vb类似

 amao 发表于2005-12-28 14:44:00  IP: 61.135.152.*
var Circle = function() {
var obj = new Object();
obj.PI = 3.14159;

obj.area = function( r ) {
return this.PI * r * r;

}
return obj;
}

var c = new Circle();
alert( c.area( 1.0 ) );

这个是不是更好理解,更像JAVA的写法

 amao 发表于2005-12-28 15:00:00  IP: 61.135.152.*
var Circle = new Object();
Circle.PI = 3.14159;
Circle.prototype.Area = function( r ) {
return this.PI * r * r;

}

alert( Circle.Area( 1.0 ) );

这样写也可以

 amao 发表于2005-12-28 15:05:00  IP: 61.135.152.*
上面写错了
var Circle = new Object();
Circle.PI = 3.14159;
Circle.Area = function( r ) {
return this.PI * r * r;

}

alert( Circle.Area( 1.0 ) );

 amao 发表于2005-12-28 15:07:00  IP: 61.135.152.*
还可以这样写
var Circle={
"PI":3.14159,
"area":function(r){
return this.PI * r * r;
}
};

alert( Circle.area(1.0) );

 amao 发表于2005-12-28 15:13:00  IP: 61.135.152.*
个人很反对JS写成OO的形式,真是没有必要

 amao 发表于2005-12-28 15:21:00  IP: 61.135.152.*
更绝的写法

var Circle = new Function("this.PI = 3.14159;this.area = function( r )
{return r*r*this.PI;}");
alert( (new Circle()).area(1.0) );