虽然JavaScript支持我们称为对象的数据类型,但是它并没有正式的类的概念.这使它有别于那些经典的面向对象程序设计语言,如C++和Java等.
    在面向对象的程序设计语言中,共有的概念是强类型和支持以类为基础的继承机制.根据这个评判标准,很容易就能够将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>

----摘录之《JavaScript权威指南》

posted on 2007-05-29 14:00  Louis.Lu.Sz  阅读(1169)  评论(0编辑  收藏  举报