您的位置:首页 > Web前端 > JavaScript

javascript面向对象实现

2008-01-30 13:20 288 查看
测试环境:windows 2003 , ie 6.0

1 面向对象的特性

类,对象变量,对象方法,类变量,类方法,继承,多态

1) 类
在javascript中类的定义格式跟函数的定义是一样的,都是用关键字function。
例子:
function classA(){
this.X= "this.X";
}
类的实例化:var obj = new classA();

2) 对象变量
格式:
this.X= "this.X";

对象变量只有在类实例化后才能引用,如:new classA().X;

3) 对象方法
格式:
this.methodAdd = function(){
alert("this.methodAdd ");
}
还有一种方式是(我理解为对象的全局方法):
classA.prototype.methodAdd = function(){
alert("classA.prototype.methodAdd ");
}
如果一个类里这两种方式都定义了,会优先调用前一种方法。
(你可以把prototype看作基类。prototype里面的变量或方法,是所有对象共享的。 比如,c.area()调用最终就会让解释器调用到Circle.prototype.area(). 相比于java和c++,javascript具有他们都没有的一个语义,也就是你可以在prototype里定义变量。定义在prototype里的变量可以被所有的实例共享量。所以一般它应该是一个常数,比如:Circle.prototype.PI = 3.14.显然,prototype里的变量和方法都应该是不变的。每一个对象实例都不应该取修改prototype中的内容。虽然语言允许你可以这样做,但这样做没有任何意义,也违反了面向对象的语义(想想,java会让你动态修改一个类的方法吗)。 )

4) 类变量

类变量是属于一个类的变量。就像java里用static修饰的变量。因为它属于类,所以它也应该是一个常量。实例不应该去修改它,虽然你可以(java里可以用final修饰,使得类变量一旦定义,就不能修改)。这里可以看到,类变量和prototype里定义的变量的功能是相似的。确实如此,他们的目的都是一样的。但他们的访问方式

不一样。比如:

Circle.prototype.PI = 3.14;
Circle.PI = 3.14;
//用prototype里的变量
Circle.prototype.area1 = function() { return this.PI * this.r * this.r; }
//用类变量
Circle.prototype.area2 = function() { return Circle.PI * this.r * this.r; }

5) 类方法
格式:
classA.methodAdd = function(){
alert("classA.methodAdd ");
}

6) 继承
function Base(){
}
function A(){
} A.prototype = new Base();

7) 多态
function Base(){
this.methodA = function(){alert("Base.this.methodA");}
}
function A(){
this.methodA = function(){alert("A.this.methodA");}
} A.prototype = new Base();

var obj= new A();
obj.methodA();//输出:A.this.methodA

虽然javascript模拟了面向对象的特性,但它毕竟只是基于对象的语言,很多面向对象的特性都不支持。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: