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 中,并不需要诸如向上转型之类的技术来取得多态的效果。
- js多态-浅析
- 浅析js解析顺序
- 浅析 JS 原型链
- 浅析JS运行机制
- JS冒泡特性浅析
- js call方法浅析
- 浅析js模板引擎
- 浅析JS运行机制3
- js继承浅析
- 浅析JS运行机制
- js DOM效率浅析
- JS匿名函数浅析
- 浅析js继承方式
- js-浅析this指向
- JS面向对象编程浅析
- JS面向对象编程浅析
- flex与js交互浅析
- flex与js交互浅析
- 对prime算法的深入理解
- 第三弹——apache服务器
- HDU 2609How many
- 第二章 正则表达式位置匹配攻略
- 到底应该学哪个PCB设计软件?
- js多态-浅析
- ACM 数论 莫比乌斯函数
- Application.persistentDataPath保存字符串到本地
- maven 项目管理器入门
- POJ 1509Glass Beads
- poj2018 Best Cow Fences(直接求斜率)
- cookie、SessionStorage、localStorage的用法
- 意见传播模型初试
- javascript数组(1) ——sort的工作原理及其他数组排序方法