JavaScript面向对象之多态

版权声明:刘家军 https://blog.csdn.net/qq_42911663/article/details/85681736

今天我们研究一下javascript面向对象中的多态

javascript 多态

在《JavaScript设计模式与开发实践》中有这么一个故事:
主人家里养了两只动物,分别是一只鸭和一只鸡,当主人向它们发出“叫”的命令时,鸭会“嘎嘎嘎”地叫,而鸡会“咯咯咯”地叫。这两只动物都会以自己的方式来发出叫声。它们同样“都是动物,并且可以发出叫声”,但根据主人的指令,它们会各自发出不同的叫声。
其实,其中就蕴含了多态的思想。下面我们通过代码进行具体的介绍。

非多态代码示例

var makeSound = function( animal ){
    if ( animal instanceof Duck ){
        console.log( '嘎嘎嘎' );
    }else if ( animal instanceof Chicken ){
        console.log( '咯咯咯' );
    }
};

var Duck = function(){};
var Chicken = function(){};

makeSound( new Duck() ); // 嘎嘎嘎
makeSound( new Chicken() ); // 咯咯咯

多态的代码示例

var makeSound = function(animal) {
    animal.sound();
}

var Duck = function(){}
Duck.prototype.sound = function() {
    console.log('嘎嘎嘎')
}
var Chicken = function() {};
Chicken.prototype.sound = function() {
    console.log('咯咯咯')
}

makeSound(new Duck()); // 嘎嘎嘎 
makeSound(new Chicken()); // 咯咯咯

关于这个例子的详细讲解,可以阅读下这本书籍的1.2章节点击查看
我们呢,还是用我们自己的例子再来讲解一遍

function makeDoSth(person) {
   person.doSth()
   }

function Ljj() {
   this.name = "刘家军",
   this.hobby = "敲代码"
   }
Ljj.prototype.doSth = function() {
   console.log(`${this.name}陪小仙女,并且还${this.hobby}了`)
   }

function Yh() {
   this.name = "袁姮",
   this.hobby = "旅游",
   this.privates = "购物"
   }
Yh.prototype.doSth = function() {
   console.log(`${this.name}陪大神仙`)
   }

const LJJ = new Ljj()
const YH = new Yh()

makeDoSth(LJJ) // 刘家军陪小仙女
makeDoSth(YH) // 袁姮陪大神仙

通过这个例子我们可以想象一下
比如 前几天元旦放假就类似发出了一个命令(makeDoSth),然后LJJ和YH都接收到了这个命令并且执行了自己要做的事情(doSth),虽然是同一个命令(makeDoSth),但是LJJ和YH做的事情(doSth)确不同;
因为放假了(makeDoSth),LJJ和YH都要做事情(doSth),所以我们将doSth这个方法抽离出来进行封装,
如果不抽离出来封装要在发号命令(makeDoSth)内部进行条件判断,但是当接收到这个命令的人越来越多,添加的判断条件越来越多,影响可读性于与扩展性
多态的实际含义是:同一操作作用于不同的对象上面,可以产生不同的解释和不同的执行结果。换句话说,给不同的对象发送同一个消息的时候,这些对象会根据这个消息分别给出不同的反馈。
在这个例子中,LJJ和YH都在发出命令(makeDoSth)后要做些事情(doSth),这是不变的,但是他们所做的事情是不同的,所具备的属性也不是完全相同的。把不变的部分隔离出来,把可变的部分封装起来,这给予了我们扩展程序的能力,程序看起来是可生长的,也是符合开放—封闭原则的,相对于修改代码来说,仅仅增加代码就能完成同样的功能,这显然优雅和安全得多。

将行为分布在各个对象中,并让这些对象各自负责自己的行为,这正是面向对象设计的优点。
多态增加了代码的可扩展性,降低了代码维护成本

猜你喜欢

转载自blog.csdn.net/qq_42911663/article/details/85681736