美文网首页我爱编程
JS进阶系列03-JS面向对象的三大特征之多态

JS进阶系列03-JS面向对象的三大特征之多态

作者: love丁酥酥 | 来源:发表于2018-03-28 01:10 被阅读55次

    1. 多态的定义

    多态是同一个行为具有多个不同表现形式或形态的能力。在JAVA中,多态通过在子类中重写父类方法去实现。但是在JS中,由于JS本身是动态的,天生就支持多态。大家可以通过几个例子来理解一下。

    2. 多态的实现

    举个例子吧,国王听腻了只有鸭子为他唱歌,他决定搞一个动物合唱团。所以,大臣们搜罗了鸭,鸡,狗等动物,而且还设置了专门的选拔官员测试,选拔官员一声令下:‘唱’,面前的动物就发出了特有的叫声,鸭子嘎嘎嘎,小鸡咯咯咯,小狗汪汪汪......要实现这个功能,我们可以使用如下代码:

    var singStart(animal){
        if (animal instanceof Duck) {
            console.log('嘎嘎嘎');
        } else if (animal instanceof Chicken) {
            console.log('咯咯咯');
        }
    function Duck(){}
    function Chicken(){}
    singStart(new Duck());  // 嘎嘎嘎
    singStart(new Chicken());  // 咯咯咯
    }
    

    这种方法当然也可以实现多态,但是却违反了封装性,我们将可变的动物类型与不可变的唱歌指令耦合到了一起。如果动物类型增加,我们必须在开始唱歌方法中新增判断分支。这就好比是选拔官员发出的指令是这样的:“你是鸭子的话,唱嘎嘎嘎,是鸡的话,唱咯咯咯,是狗的话,唱汪汪汪......”这明显是不合理的。真实的情况应该是,选拔官员发出简短清晰的指令“唱”时,每种动物会场出自己独有的声音。
    让我们用面向对象的思想去考虑,将不变的指令隔离开来,将可变的具体实现封装起来。JAVA会使用类继承和重写的方式来实现,如下:

    abstract class Animal {  
        abstract void sing();  
    }  
      
    class Duck extends Animal {  
        public void sing() {  
            System.out.println("嘎嘎嘎");  
        }  
    }  
      
    class Chicken extends Animal {  
        public void sing() {  
            System.out.println("咯咯咯");  
        }  
    } 
    public class Test {
        public static void main(String[] args) {
            Animal duck = new Duck();
            Animal chicken = new Chicken();
            singStart(duck);  // 嘎嘎嘎
            singStart(chicken);  // 咯咯咯
      }  
                
    public static void singStart(Animal a)  {
          a.sing();
    }
    

    而对于JS来讲,我们为具体的动物类型的原型定义具体的sing方法即可,如下:

    function Duck(){}
    Duck.prototype.sing = function(){
        console.log('嘎嘎嘎');
    }
    function Chicken(){}
    Chicken.protorype.sing = function(){
        console.log(‘咯咯咯’);
    }
    function singStart(animal){
        animal.sing();
    }
    singStart(new Duck());  // 嘎嘎嘎
    singStart(new Chicken());  // 咯咯咯
    

    而且,更棒的是,JS是动态的,这里并不限制传入的参数类型是animal。大家可以看到,我们在代码中,也没有实现Animal这个类型,事实上,我们可以传入任意类型的对象,只要它正确包含一个sing方法即可。如下:

    function Person(){}
    Person.protorype.sing = function(){
        console.log(‘哈哈哈’);
    }
    singStart(new Person());  // 哈哈哈
    

    可以看出来,在JS中实现多态更加方便,且更加强大。

    参考

    BOOK-《JavaScript设计模式与开发实践》 第一部分
    Javascript基于对象三大特征
    【原生js】js面向对象三大特征之多态笔记
    JAVA多态

    相关文章

      网友评论

        本文标题:JS进阶系列03-JS面向对象的三大特征之多态

        本文链接:https://www.haomeiwen.com/subject/fxxkcftx.html