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模拟了面向对象的特性,但它毕竟只是基于对象的语言,很多面向对象的特性都不支持。
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模拟了面向对象的特性,但它毕竟只是基于对象的语言,很多面向对象的特性都不支持。
相关文章推荐
- JavaScript 面向对象(封装、继承、多态)多种方式实现完全总结
- Javascript内置对象和面向对象的实现----对象和数组的概念
- JavaScript使用Prototype实现面向对象的方法
- javaScript采用面向对象的方式实现实现拖拽
- 浅谈javascript的面向对象(一)如何实现类
- JavaScript面向对象的继承机制实现方式
- [翻译]javascript学习笔记 (四)-面向对象的实现
- javascript面向对象系列第三篇——实现继承的3种形式
- JavaScript中的new-prototype面向对象实现原理
- JavaScript中,prototype对象是实现面向对象的一个重要机制
- JavaScript如何实现面向对象和继承机制?
- javascript 面向对象的继承的实现
- 利用javascript的面向对象的特性实现限制试用期
- JavaScript基于面向对象实现的猜拳游戏
- Javascript高级程序设计——面向对象之实现继承
- javascript面向对象的方式实现的弹出层效果代码
- javascript面向对象实现java常用的1StringBuffer,Map,Collection,List,Set
- javascript面向对象中的对象创建、继承、封装等实现方式
- JavaScript面向对象之属性实现
- JavaScript面向对象的实现方法小结