JavaScript多态设计

转载:http://blog.csdn.net/lining213/article/details/6119442

 

<script>
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"); // 演示方法重载
  
    }

    main();
</script>

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值