首页 > js 多态如何理解,最好能有个例子

js 多态如何理解,最好能有个例子

最近读到一本书《JavaScript设计模式与开发实践》上,讲到js的多态,我在JavaScript高级程序编程里貌似都没有见过关于这个的详细讲解,所以想问问大家有没有什么推荐的文章或者博客,可以推荐给小弟的,让小弟可以深入了解一下。
先把那本上的例子拿出来跟大家分享:
书里面的故事:本人家里养了一只鸡,一只鸭。当主人向他们发出‘叫’的命令时。鸭子会嘎嘎的叫,而鸡会咯咯的叫。转化成代码形式如下

非多态代码示例

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

多态的代码示例

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

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

makeSound(new Chicken());
makeSound(new Duck());

多态背后的思想是将”做什么“和”谁去做以及怎样去做分开“。


同一个实现接口,使用不同的实例而执行不同的操作。比如:打印机可以看作是父类,黑白打印机、彩色打印机是他的两个子类。父类打印机中的方法“打印”在每个子类中有各自不同的实现方式,比如对黑白打印机执行打印操作后,打印效果是黑白的,而对彩色打印机进行打印操作后,打印效果是彩色的。


这种是通过该构造函数判断的。要想通过参数类型 和 参数个数 可以用arguments,js不支持重载,没必要这样


鸭子类(Duck Type)是Mixin-Pattern的结果,就是将A的特性(方法+字段)赋予到B中,而A与B均对此无感知,唯一感知的就是调用者C而已,并且强调A与B并不能严格地抽象为同一个类别,仅形似而神不似。
由于JS是动态类型脚本语言,因此Duck Type在运用上符合多态的特性。
若要遵循多态定义中,子类重写父类方法,并且子类示可任意例替代父类实例的调用,则要采用JS中delegate-base inheritance来实现多态了。
具体可参考http://www.cnblogs.com/fsjohnhuang/p/4634039.html


我换个角度提下我个人的小建议。多态是程序设计模式中重中之重的问题,深入学习设计模式,也就明白什么是多态了。

【热门文章】
【热门文章】