javascript与多态

发表于2018-02-04 23:44 阅读(190)

多态的含义:同一操作作用于不同的对象上面,可以产生不同的解释和不同的执行结果

一段多态的JavaScript代码实现如下:

var makeSound = function(animal){
    if(animal instanceof Duck){
        console.log("嘎嘎嘎");
    }
    if(animal instanceof Chicken){               console.log("咯咯咯");             }}
var Duck = function(){};
var Chicken = function(){};
makeSound(new Duck());//嘎嘎嘎
makeSound(new Chicken());//咯咯咯

这段代码确实体现了多态性,当我们分别向鸡和鸭发出“叫唤”的消息时,它们根据此消息做出了不同的反应。但这样的多态性差强人意,当我们后边又添加一只动物,比如让狗发出“汪汪汪”,就需要修改makeSound函数。而这种修改代码的方式是危险的,修改的地方越多,程序出错的概率就越大,而且后边添加的动物越来越多时,makeSound就可能成为一个巨大的函数。

多态背后的思想是将“做什么”和“谁去做以及怎么去做”分离开来,也就是将“不变的事物”与“可能改变的事物”分来开来。在这个例子,动物都会叫,这是不变的,不同动物具体怎么叫是可变的。把不变的部分隔离出来,把可变的封装起来,就可以让程序具有可扩展性,也是符合封闭-开放原则。

改写后的代码如下:

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 Children())//咯咯咯

如果后边添加狗,只需要添加狗类就OK了

var Dog = function(){};
Dog.prototype.sound = function(){
    console.log("汪汪汪");
}

makeSound(new Dog())//汪汪汪

参考书籍:javascript设计模式与开发实践