JS中的多态实例详解


Posted in Javascript onOctober 15, 2017

 多态在面向对象编程语言中是十分重要的。在JAVA中是通过继承来得到多态的效果。如下:

public abstract class Animal {
abstract void makeSound(); // 抽象方法
}
public class Chicken extends Animal{
public void makeSound(){
System.out.println( "咯咯咯" );
}
}
public class Duck extends Animal{
public void makeSound(){
System.out.println( "嘎嘎嘎" );
}
}
Animal duck = new Duck(); // (1)
Animal chicken = new Chicken(); // (2)

多态的思想实际上是把“做什么”和“谁去做”分离开来,要实现这一点,归根结底先要消除类型之间的耦合关系。
在Java中,可以通过向上转型来实现多态。而javascript的变量在运行期是可变的,一个js对象既可以表示既可以表示Duck类型的对象,又可以表示Chicken类型的对象,这意味着JavaScript对象的多态性是与生俱来的。

多态最根本的作用就是通过把过程化的条件分支语句转化为对象的多态性, 从而消除这些条件分支语句。

假设我们要编写一个地图应用,现在有两家可选的地图API提供商供我们接入自己的应 用。目前我们选择的是谷歌地图,谷歌地图的API中提供了show方法,负责在页面上展 示整个地图。示例代码如下:

var googleMap = {
show: function(){
console.log( '开始渲染谷歌地图' );
}
};
var renderMap = function(){
googleMap.show();
};
renderMap(); // 输出:开始渲染谷歌地图
var googleMap = {
show: function(){
console.log( '开始渲染谷歌地图' );
}
};
var baiduMap = {
show: function(){
console.log( '开始渲染百度地图' );
}
};
var renderMap = function( type ){
if ( type === 'google' ){
googleMap.show();
}else if ( type === 'baidu' ){
baiduMap.show();
}
};
renderMap( 'google' ); // 输出:开始渲染谷歌地图
renderMap( 'baidu' ); // 输出:开始渲染百度地图

可以看到,虽然renderMap函数目前保持了一定的弹性,但这种弹性是很脆弱的,一旦需要替换成搜搜地图,那无疑必须得改动renderMap函数,继续往里面堆砌条件分支语句。

我们还是先把程序中相同的部分抽象出来,那就是显示某个地图:

var renderMap = function( map ){
if ( map.show instanceof Function ){
map.show();
}
};
renderMap( googleMap ); // 输出:开始渲染谷歌地图
renderMap( baiduMap ); // 输出:开始渲染百度地图

之后我们又新增了腾讯地图的支持,那我们很快变可以实现这个功能,而且不必修改原代码:

var TencentMap = {
  show: function(){
console.log( '开始渲染腾讯地图' );
}
}
renderMap( sosoMap ); // 输出:开始渲染腾讯地图

多态技术至关重要,很多设计模式都是巧妙利用多态来实现。

总结

以上所述是小编给大家介绍的JS中的多态实例,希望对大家有所帮助!

Javascript 相关文章推荐
JavaScript Event学习第八章 事件的顺序
Feb 07 Javascript
十个优秀的Ajax/Javascript实例网站收集
Mar 31 Javascript
jquery时间下拉框小例子
Apr 15 Javascript
php跨域调用json的例子
Nov 13 Javascript
通过jquery-ui中的sortable来实现拖拽排序的简单实例
May 24 Javascript
让你一句话理解闭包(简单易懂)
Jun 03 Javascript
jquery uploadify隐藏上传进度的实现方法
Feb 06 Javascript
vue用addRoutes实现动态路由的示例
Sep 15 Javascript
axios 处理 302 状态码的解决方法
Apr 10 Javascript
如何使用JavaScript实现栈与队列
Jun 24 Javascript
JS开发 富文本编辑器TinyMCE详解
Jul 19 Javascript
javascript canvas时钟模拟器
Jul 13 Javascript
vue跨域解决方法
Oct 15 #Javascript
JS实现定时任务每隔N秒请求后台setInterval定时和ajax请求问题
Oct 15 #Javascript
详解 vue.js用法和特性
Oct 15 #Javascript
jQuery实现的页面遮罩层功能示例【测试可用】
Oct 14 #jQuery
JS简单实现数组去重的方法分析
Oct 14 #Javascript
jQuery响应滚动条事件功能示例
Oct 14 #jQuery
JS实现的简单表单验证功能完整实例
Oct 14 #Javascript
You might like
法兰绒滤网冲泡
2021/03/03 冲泡冲煮
php switch语句多个值匹配同一代码块的实现
2014/03/03 PHP
一个不易被发现的PHP后门代码解析
2014/07/05 PHP
PHP限制HTML内容中图片必须是本站的方法
2015/06/16 PHP
php的laravel框架快速集成微信登录的方法
2016/12/12 PHP
基于jquery实现漂亮的动态信息提示效果
2011/08/02 Javascript
Javascript继承(上)——对象构建介绍
2012/11/08 Javascript
在javascript中执行任意html代码的方法示例解读
2013/12/25 Javascript
JavaScript中的对象序列化介绍
2014/12/30 Javascript
js实现文本框中输入文字页面中div层同步获取文本框内容的方法
2015/03/03 Javascript
JS动态修改图片的URL(src)的方法
2015/04/01 Javascript
jQuery 获取遍历获取table中每一个tr中的第一个td的方法
2016/10/05 Javascript
vue.js实现含搜索的多种复选框(附源码)
2017/03/23 Javascript
360doc网站不登录就无法复制内容的解决方法
2018/01/27 Javascript
JS 实现百度搜索功能
2018/02/01 Javascript
JavaScript求一个数组中重复出现次数最多的元素及其下标位置示例
2018/07/23 Javascript
webpack4实现不同的导出类型
2019/04/09 Javascript
微信小程序实现搜索历史功能
2020/03/26 Javascript
jQuery 选择方法及$(this)用法实例分析
2020/05/19 jQuery
40行代码把Vue3的响应式集成进React做状态管理
2020/05/20 Javascript
微信小程序实现翻牌抽奖动画
2020/09/21 Javascript
[03:35]2018年度DOTA2最佳辅助位选手5号位-完美盛典
2018/12/17 DOTA
Python新手在作用域方面经常容易碰到的问题
2015/04/03 Python
在Windows系统上搭建Nginx+Python+MySQL环境的教程
2015/12/25 Python
关于django 数据库迁移(migrate)应该知道的一些事
2018/05/27 Python
Python 控制终端输出文字的实例
2019/07/12 Python
浅谈Python中(&,|)和(and,or)之间的区别
2019/08/07 Python
python中sort和sorted排序的实例方法
2019/08/26 Python
Python 通过截图匹配原图中的位置(opencv)实例
2019/08/27 Python
Python 实现加密过的PDF文件转WORD格式
2020/02/04 Python
Python Handler处理器和自定义Opener原理详解
2020/03/05 Python
python3通过qq邮箱发送邮件以及附件
2020/05/20 Python
如何基于Django实现上下文章跳转
2020/09/16 Python
测控技术与通信工程毕业生自荐信范文
2013/12/28 职场文书
人事任命书格式
2014/06/05 职场文书
礼貌问候语大全
2015/11/10 职场文书