zoukankan      html  css  js  c++  java
  • 面向对象的JavaScript 类设计

        虽然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权威指南》

  • 相关阅读:
    递归函数及Java范例
    笔记本的硬盘坏了
    “References to generic type List should be parameterized”
    配置管理软件(configuration management software)介绍
    WinCE文件目录定制及内存调整
    使用Silverlight for Embedded开发绚丽的界面(3)
    wince国际化语言支持
    Eclipse IDE for Java EE Developers 与Eclipse Classic 区别
    WinCE Heartbeat Message的实现
    使用Silverlight for Embedded开发绚丽的界面(2)
  • 原文地址:https://www.cnblogs.com/luqingfei/p/763875.html
Copyright © 2011-2022 走看看