js多态-浅析

来源:互联网 发布:猎豹安全浏览器mac 编辑:程序博客网 时间:2024/06/06 01:30

《JavaScript设计模式与开发实践》上,讲到js的多态,我觉得书上的例子还是挺好的,特此总结一下。
多态就是 同一个操作 作用于不同的对象上面,会产生不同的解释和不同的执行结果。或者说,给不同的对象发送同一个消息的时候,这些对象会根据这个消息分别给出不同的反馈。

主人家里养了两只动物,分别是一只鸭和一只鸡,当主人向它们出“叫”的命令时,鸭会“嘎嘎嘎”地叫,而鸡会“咯咯咯”地叫。这两只动物都会以自己的方式来发出叫声。它们同样“都是动物,并且可以发出叫声”,但根据主人的指令,它们会各自发出不同的叫声。

//有多态思想,但是扩展性差,多来一只狗,还要改动makeSound函数,易出错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 maskSound = function(animal){    animal.sound();}var Chicken = function(){}Chicken.prototype.sound=function(){    console.log('咯咯咯');}var Duck = function(){}Duck.prototype.sound = function(){    console.log( '嘎嘎嘎' );};makeSound( new Duck() ); // 嘎嘎嘎makeSound( new Chicken() ); // 咯咯咯

扩展:来了一只狗,会叫的函数不用变,只需添加上狗怎么叫的代码就行。

var Dog = function(){}Dog.prototype.sound = function(){console.log( '汪汪汪' );};makeSound( new Dog() ); // 汪汪汪

JavaScript 对象的多态性是与生俱来的

JavaScript 的变量类型在运行期是可变的。一个 JavaScript 对象,既可以表示 Duck 类型的 对象,又可以表示Chicken 类型的对象,这意味着 JavaScript 对象的多态性是与生俱来的。 这种与生俱来的多态性并不难解释。

JavaScript 作为一门动态类型语言,它在编译时没有类型 检查的过程,既没有检查创建的对象类型,又没有检查传递的参数类型。

在上面代码示例中, 我们既可以往 makeSound 函数里传递 duck 对象当作参数,也可以传递 chicken 对象当作参数。 由此可见,某一种动物能否发出叫声,只取决于它有没有 makeSound 方法,而不取决于它是否是某种类型的对象,这里不存在任何程度上的“类型耦合”。这正是我们从上一节的鸭子类型 中领悟的道理。在 JavaScript 中,并不需要诸如向上转型之类的技术来取得多态的效果。

原创粉丝点击