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 相关文章推荐
js动态设置鼠标事件示例代码
Oct 30 Javascript
三种动态加载js的jquery实例代码另附去除js方法
Apr 30 Javascript
javascript数组遍历for与for in区别详解
Dec 04 Javascript
jQuery源码解读之removeClass()方法分析
Feb 20 Javascript
AngularJS的内置过滤器详解
May 14 Javascript
MVVM模式中ViewModel和View、Model有什么区别?
Jun 19 Javascript
Javascript实现鼠标框选操作  不是点击选取
Apr 14 Javascript
jQuery通过ajax快速批量提交表单数据
Oct 25 Javascript
vuejs通过filterBy、orderBy实现搜索筛选、降序排序数据
Oct 26 Javascript
Angular4实现鼠标悬停3d倾斜效果
Oct 25 Javascript
垃圾回收器的相关知识点总结
May 13 Javascript
JS自定义对象创建与简单使用方法示例
Jan 15 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
php 设计模式之 工厂模式
2008/12/19 PHP
php数组函数序列之array_combine() - 数组合并函数使用说明
2011/10/29 PHP
PHP容易忘记的知识点分享
2013/04/30 PHP
ThinkPHP基于PHPExcel导入Excel文件的方法
2014/10/15 PHP
php检查字符串中是否有外链的方法
2015/07/29 PHP
php实现处理输入转义字符的代码
2015/11/08 PHP
jquery 插件实现图片延迟加载效果代码
2010/02/06 Javascript
cnblogs 代码高亮显示后的代码复制问题解决实现代码
2011/12/14 Javascript
js格式化金额可选是否带千分位以及保留精度
2014/01/28 Javascript
浅析js的模块化编写 require.js
2016/12/07 Javascript
JS实现Ajax的方法分析
2016/12/20 Javascript
jQuery.Sumoselect插件实现下拉复选框效果
2017/11/09 jQuery
vue+express 构建后台管理系统的示例代码
2018/07/19 Javascript
Vue递归实现树形菜单方法实例
2018/11/06 Javascript
深入浅析ng-bootstrap 组件集中 tabset 组件的实现分析
2019/07/19 Javascript
[40:05]DOTA2上海特级锦标赛A组小组赛#1 EHOME VS MVP.Phx第一局
2016/02/25 DOTA
[03:08]TI9战队档案 - Vici Gaming
2019/08/20 DOTA
Python用模块pytz来转换时区
2016/08/19 Python
django 实现电子支付功能的示例代码
2018/07/25 Python
Python如何基于Tesseract实现识别文字功能
2020/06/05 Python
keras 指定程序在某块卡上训练实例
2020/06/22 Python
Python 爬虫的原理
2020/07/30 Python
selenium3.0+python之环境搭建的方法步骤
2021/02/01 Python
CSS3 选择器 属性选择器介绍
2012/01/21 HTML / CSS
英国奢侈品网站:MatchesFashion
2016/12/16 全球购物
罗技英国官方网站:Logitech UK
2020/11/03 全球购物
女大学生毕业找工作的自我评价
2013/10/03 职场文书
简历的自荐信
2013/12/19 职场文书
《地震中的父与子》教学反思
2014/04/10 职场文书
班风口号
2014/06/18 职场文书
2015年党员承诺书
2015/01/21 职场文书
小学数学教师研修日志
2015/11/13 职场文书
详解Python生成器和基于生成器的协程
2021/06/03 Python
python四种出行路线规划的实现
2021/06/23 Python
Python编程源码报错解决方法总结经验分享
2021/10/05 Python
python井字棋游戏实现人机对战
2022/04/28 Python