javascript 多态

var PersonPojo = function(){
    
    // 定义私有域(即成员变量)
     var name = "佚名" ;   // 姓名
     var age =   18   ;   // 年龄
     var sex = "男" ;   // 性别
    
    // 姓名取值方法
     this.getName = function() {
      return name;
     };
    // 姓名赋值方法
     this.setName = function(n) {
      name = n;
     };
    // 年龄取值方法
     this.getAge = function () {
      return age;
     };
    // 年龄赋值方法
     this.setAge = function(a) {
      age = a;
     };
    // 性别取值方法
     this.getSex = function() {
      return sex;
     };
    // 性别赋值方法
     this.setSex = function(s) {
      sex = s;
     };
    
    // 自我介绍的方法
     this.selfIntro = function() {
      alert("我是一个名字叫"
       + this.getName() + ",年龄为"
       + this.getAge() + "的"
       + this.getSex() + "人!");
     };
    
    }
  
    /**
    * 学员Pojo类(作为本演示中的派生类(或称子类)角色出场)
    * 演示OOP在JavaScript中多态的书写方式
    * By CodingMouse
    */
    var StudentPojo = function(){
   
    // 自我介绍的方法(覆盖父类PersonPojo的selfIntro方法)
     this.selfIntro = function() {
      alert("我是一个名字叫"
       + this.getName() + ",年龄为"
       + this.getAge() + "的"
       + this.getSex() + "学员!");
     };
    
    }
   
   /**
    * 教员Pojo类(作为本演示中的派生类(或称子类)角色出场)
    * 演示OOP在JavaScript中多态的书写方式
    * By CodingMouse
    */
    var TeacherPojo = function() {
   
    // 自我介绍的方法(覆盖父类PersonPojo的selfIntro方法)
     this.selfIntro = function() {
    
     // JavaScript中是使用arguments对象(可变参数,实现方法重载的关键点)来实现重载机制的
      alert("我是一个名字叫"
       + this.getName() + ",年龄为"
       + this.getAge() + "的"
       + this.getSex() + "教员"
       + (arguments.length == 1 ? (",主讲" + arguments[0] + "课程") : "")
       + "!");
     
     };
   
    }
   
   /**
    * 使用StudentPojo/TeacherPojo原型(prototype)方式呼叫PersonPojo出场,
    * 通过指定prototype,你就可以在StudentPojo/TeacherPojo类中如同在Java中呼叫父
    * 类的方式调用父类的公共域。此处可以理解为如同在Java中使用extends
    * 关键字通知编译器StudentPojo/TeacherPojo类要继承PersonPojo类。
    */
    StudentPojo.prototype = new PersonPojo();
    TeacherPojo.prototype = new PersonPojo();
   
   /**
    * 关键点:打招呼的演示方法 - 利用多态特性呼叫自我介绍方法
    *(演示多态,由子类去呼叫父类方法,父类方法自动调用被子类覆盖过的同名方法)
    * 使用父类类型的引用指向子类的对象。
    */
    function SayHello(intro) {
   
     // 判断实参是否是PersonPojo的一个实例
     if (intro instanceof PersonPojo) {
      // 调用自我介绍方法(编译器会自动获取被覆盖过的子类方法并调用)
      intro.selfIntro();
     }
    
    }
   
   // 测试程序主方法
    function main(){
   
    // 创建一个学员实例并设置属性(演示方法覆盖/重写)
     var stu = new StudentPojo();
     stu.setName("张三");
     stu.setAge(21);
     stu.setSex("男");
     // 创建一个教员实例并设置属性(演示方法覆盖/重写)
     var tea = new TeacherPojo();
     tea.setName("周七");
     tea.setAge(26);
     tea.setSex("女");
    // 创建另一个教员实例并设置属性(演示方法重载)
     var tea2 = new TeacherPojo();
     tea2.setName("周七");
     tea2.setAge(26);
     tea2.setSex("女");
    
    /**
     * 关键点:利用多态特性呼叫自我介绍方法
     *(演示多态,由子类去呼叫父类方法,父类方法自动调用被子类覆盖过的同名方法)
     * 使用父类类型的引用指向子类的对象。
     */
     SayHello(stu);
     SayHello(tea);
     tea2.selfIntro("Java"); // 演示方法重载
   
    }

你可能感兴趣的:(javascript 多态)