• 面向对象的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权威指南》

  • 相关阅读:
    jenkins使用
    pytest+allure生成接口自动化测试报告
    charles系列
    go语言安装使用
    go语言介绍
    Nginx
    python面试题-python相关
    pyhon全栈开发学习目录
    补充【第二章】supervisor守护进程保障服务
    python全栈开发基础【补充】python中列表排序,字典排序,列表中的字典排序
  • 原文地址:https://www.cnblogs.com/luqingfei/p/763875.html
Copyright © 2020-2023  润新知