在面向对象的程序设计语言中,共有的概念是强类型和支持以类为基础的继承机制.根据这个评判标准,很容易就能够将JavaScript从真正的面向对象语言中区分出来.但是,我们又会发现JavaScript大量地使用了对象,而且它还有自己的以原型对象为基础的继承机制,这些又说明JavaScript是一种真正的面向对象语言.它从大量其他的面向对象语言中获取了灵感,这些语言采取以原型对象为基础的继承机制,而不是采用以类为基础的继承机制.
虽然JavaScript不是一种以类为基础的面向对象程序设计语言,但是它在模拟像Java和C++这样的以类为基础的语言时是相当出色的.
对象是一个数据结构,包含各种命名了的数据段,而且还能包含对这些数据段进行操作的各种方法.JavaScript中的对象可以具有大量的属性,而且还可以动态地将这些属性添加到对象中.这在像Java和C++这样的强类型语言中是做不到的.在那些语言中,每个对象都有一套预定义的属性,而且每个属性都有有预定义的类型.在使用JavaScript在对象来模拟面向对象的程序设计方法时,通常是给每个对象预定义一套属性以及这些属性的数据类型.
在Java和C++中,类定义了对象的结构,类确定了一个对象包含有哪些域(字段)以及每个域包含什么样的数据类型.类也定义了对对象进行操作的方法.虽然JavaScript并没有正式的类的概念,但是我们可以用构造函数和原型对象模拟出类来.
一个Java类的成员有四种可能的基本类型:实例属性,实例方法,类属性以及类方法.那么在JavaScript中是如何模拟它们的呢? 请看下面的代码:
1<html>
2<head><title>类成员</title></head>
3<body>
4<script language="javascript">
5 // 真正基于类的面向对象语言中,类有四种基本成员:
6 // 实例属性,实例方法,类属性,类方法。
7 // JavaScript虽不是基于类的语言,也没有类的概念,但是它可以模拟出面向对象的设计
8
9 function Circle(radius){ //这个构造函数定义了类自身。
10 //r是构造函数定义并初始化的一个实例属性
11 this.r = radius;
12 }
13
14 //Circle.PI是一个类属性,它是构造函数的一个属性。
15 Circle.PI = 3.14159;
16
17 //以下的函数将计算圆的面积。
18 function Circle_Area(){
19 return Circle.PI * this.r * this.r;
20 }
21
22 //下面通过把函数赋给构造函数的原型对象使它成为一个实例方法。
23 //记住,在Circle构造函数中,我们可以用函数直接量定义一个无需命名为Circle_Area的函数。
24 Circle.prototype.area = Circle_Area;
25
26 //以下是另一个函数,它以两个Circle对象作为这际参数,并
27 //返回其中较大的一个(取半径较大的实际参数)
28 function Circle_Max(a, b){
29 if (a.r > b.r)
30 {
31 return a;
32 }
33 else
34 {
35 return b;
36 }
37 }
38
39 //由于该函数比较的是两个Circle对象,所以将它看作为对个别Circle对象进行操作的实例方法,是没有意义的。
40 //但是我们不希望它成为一个独立的函数,所以我们把它赋予一个构造函数,使它成为类方法。
41 Circle.max = Circle_Max;
42
43 // 下面的代码使用了Circle对象的各个成员:
44
45 var c = new Circle(1); //创建Circle类的一个实例。
46 c.r = 4; //设置实例属性r。
47 var a = c.area(); //调用实例方法area();
48 var x = Circle.PI; //调用类属性。
49 var d = new Circle(2); //创建另一个Circle实例。
50 var bigger = Circle.max(c, d);//使用类方法。
51
52 var msg = "实例c的半径为: " + c.r + "\n\r" +
53 "实例c的面积为: " + a + "\n\r" +
54 "类的PI值: " + x + "\n\r" +
55 "调用类的方法,求出两个圆中最大的一个的半径为:" + bigger.r;
56 alert(msg);
57
58</script>
59</body>
60</html>
2<head><title>类成员</title></head>
3<body>
4<script language="javascript">
5 // 真正基于类的面向对象语言中,类有四种基本成员:
6 // 实例属性,实例方法,类属性,类方法。
7 // JavaScript虽不是基于类的语言,也没有类的概念,但是它可以模拟出面向对象的设计
8
9 function Circle(radius){ //这个构造函数定义了类自身。
10 //r是构造函数定义并初始化的一个实例属性
11 this.r = radius;
12 }
13
14 //Circle.PI是一个类属性,它是构造函数的一个属性。
15 Circle.PI = 3.14159;
16
17 //以下的函数将计算圆的面积。
18 function Circle_Area(){
19 return Circle.PI * this.r * this.r;
20 }
21
22 //下面通过把函数赋给构造函数的原型对象使它成为一个实例方法。
23 //记住,在Circle构造函数中,我们可以用函数直接量定义一个无需命名为Circle_Area的函数。
24 Circle.prototype.area = Circle_Area;
25
26 //以下是另一个函数,它以两个Circle对象作为这际参数,并
27 //返回其中较大的一个(取半径较大的实际参数)
28 function Circle_Max(a, b){
29 if (a.r > b.r)
30 {
31 return a;
32 }
33 else
34 {
35 return b;
36 }
37 }
38
39 //由于该函数比较的是两个Circle对象,所以将它看作为对个别Circle对象进行操作的实例方法,是没有意义的。
40 //但是我们不希望它成为一个独立的函数,所以我们把它赋予一个构造函数,使它成为类方法。
41 Circle.max = Circle_Max;
42
43 // 下面的代码使用了Circle对象的各个成员:
44
45 var c = new Circle(1); //创建Circle类的一个实例。
46 c.r = 4; //设置实例属性r。
47 var a = c.area(); //调用实例方法area();
48 var x = Circle.PI; //调用类属性。
49 var d = new Circle(2); //创建另一个Circle实例。
50 var bigger = Circle.max(c, d);//使用类方法。
51
52 var msg = "实例c的半径为: " + c.r + "\n\r" +
53 "实例c的面积为: " + a + "\n\r" +
54 "类的PI值: " + x + "\n\r" +
55 "调用类的方法,求出两个圆中最大的一个的半径为:" + bigger.r;
56 alert(msg);
57
58</script>
59</body>
60</html>
----摘录之《JavaScript权威指南》