以一个最简单的例子把OO的JavaScript说明白
以一个最简单的例子把OO的JavaScript说明白<http://blog.csdn.net/calvinxiu/archive/2005/05/20/377097.aspx> OO的JavaScript并不高深,麻烦就麻烦在google出来的国人介绍文章经常罗罗嗦嗦,而且之间的说法还各有不同,摆在一起就让人看了头大。 *1.一个颇为精简的例子* *只需理解三个关键字: 第二个是*this*指针,代表调用这个函数的对象。 第三个是*prototype*,用它来定义成员函数, 比较规范和保险。 //定义Circle类,拥有成员变量r,常量PI和计算面积的成员函数area() //使用Circle类 另外成员函数定义还可以写成这样: function compute_area(){return Circle.PI * this.r * this.r;} *2.继承* *注意两点* //定义ChildCircle子类 } else return b; //使用ChildCircle子类 *3.var式定义* var newCircle= BTW.吃饱了撑着可以看看Rails带的OO Javascript库--Prototype <http://prototype.conio.net/> Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=377097 errorter 发表于2005-05-21 14:31:00 IP: 61.186.252.* cedarjava 发表于2005-05-23 13:53:00 IP: 61.186.252.* GoADPASS 发表于2005-05-24 15:17:00 IP: 61.186.252.* calvin 发表于2005-05-26 00:25:00 IP: 61.186.252.* new Circle(0)表明调用的是function Cricle(i) Larlf 发表于2005-05-26 12:44:00 IP: 61.186.252.* xx 发表于2005-05-26 18:42:00 IP: 61.186.252.* xx 发表于2005-05-26 18:45:00 IP: 61.186.252.* } ynyangtao 发表于2005-05-28 20:38:00 IP: 61.186.252.* vv 发表于2005-05-30 12:55:00 IP: 61.186.252.* 自由的飞碟 发表于2005-05-31 09:50:00 IP: Ping Back来自:www.donews.net aa 发表于2005-06-06 14:27:00 IP: 61.186.252.* 高温接近开关 <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.* amao 发表于2005-12-28 14:44:00 IP: 61.135.152.* obj.area = function( r ) { } 这个是不是更好理解,更像JAVA的写法 amao 发表于2005-12-28 15:00:00 IP: 61.135.152.* } 这样写也可以 amao 发表于2005-12-28 15:05:00 IP: 61.135.152.* } amao 发表于2005-12-28 15:07:00 IP: 61.135.152.* amao 发表于2005-12-28 15:13:00 IP: 61.135.152.* amao 发表于2005-12-28 15:21:00 IP: 61.135.152.* var Circle = new Function("this.PI = 3.14159;this.area = function( r )
这里重拾简单主义,以一个最简单的例子把OO Javascript说明白。
*第一个是*function *,JS世界里Class的定义用"function",function里面的内容就是构造函数的内容。
function Circle(radius)
{
this.r = radius;
}
Circle.PI = 3.14159;
Circle.prototype.area = function( ) {return Circle.PI * this.r * this.r;}
var c = new Circle(1.0);
alert(c.area());
Circle.prototype.area=compute_area;
1.定义继承关系 ChildCircle.prototype=new Circle(0); 其中0是占位用的
2.调用父类的构造函数
this.base=Circle;
this.base(radius);
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;
}
ChildCircle.max = Circle_max;
var c = new ChildCircle(1);
var d = new ChildCircle(2);
var bigger = d.max(c,d);
alert(bigger.area());
JS还支持一种var Circle={raidus:1.0,PI:3.1415}的形式,语法就如CSS的定义。
因此如果Circle只有一个实例,下面的定义方式更简洁:
{
r:1.0,
PI:3.1415,
area: function(){ return this.PI * this.r * this.r;}
};
alert(newCircle.area());
其实,Javascript现在的语法真的不适合那么别扭的写成OO模式....
[点击此处收藏本文
呵 醍醐灌顶
漂亮极了
我对javascript有一些了解,但是对其中的oo概念,总是有些模糊,因为它使我想到java的oo,多态作为oo的一个特性,在javavascript类构造器张可以体现出来,但是其中方法怎么不可以重载呢?
什么叫占位符???
占位符就是如果同时有如下函数
function Circle()
function Circle(i)
function Circle(i,j)
没有看出引入prototype有什么太大的好处。
使用占位符也有较大的问题:如果父类中有方法使用到构造方法传入的参数怎么办?
如何获得子类集成过来的父类的变量???
//定义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也是错的
其实prototype就相当于java里的static了,你说java缺少static行吗?
javascript太弱了,用他来OOP感觉呕心呖血
TrackBack来自《以一个最简单的例子把OO的JavaScript说明白
》<http://www.donews.net/z954134/archive/2005/05/31/406070.aspx>
:
js高手可不是这样写的.
真系不是普通的难
javascript的类定义太不清晰了,与java要差太离谱了, vbscript的类定义还是比较清晰,好像只是不支持继承,语法与vb类似
var Circle = function() {
var obj = new Object();
obj.PI = 3.14159;
return this.PI * r * r;
return obj;
}
var c = new Circle();
alert( c.area( 1.0 ) );
var Circle = new Object();
Circle.PI = 3.14159;
Circle.prototype.Area = function( r ) {
return this.PI * r * r;
alert( Circle.Area( 1.0 ) );
上面写错了
var Circle = new Object();
Circle.PI = 3.14159;
Circle.Area = function( r ) {
return this.PI * r * r;
alert( Circle.Area( 1.0 ) );
还可以这样写
var Circle={
"PI":3.14159,
"area":function(r){
return this.PI * r * r;
}
};
alert( Circle.area(1.0) );
个人很反对JS写成OO的形式,真是没有必要
更绝的写法
{return r*r*this.PI;}");
alert( (new Circle()).area(1.0) );