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

来源:百度文库 编辑:神马文学网 时间:2024/04/29 18:24:01
以一个最简单的例子把OO的JavaScript说明白
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
其实,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说明白


Ping Back来自:www.donews.net
aa 发表于2005-06-06 14:27:00  IP: 61.186.252.*
js高手可不是这样写的.
高温接近开关 发表于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) );