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之dhDataGrid Ver2.0.0代码
Jul 01 Javascript
javascript 混合的构造函数和原型方式,动态原型方式
Dec 07 Javascript
基于jquery+thickbox仿校内登录注册框
Jun 07 Javascript
js 图片随机不定向浮动的实现代码
Jul 02 Javascript
Javascript中Array.prototype.map()详解
Oct 22 Javascript
jquery插件ContextMenu设置右键菜单
Mar 13 Javascript
angularjs指令之绑定策略(@、=、&)
Apr 13 Javascript
jquery实现图片无缝滚动 蒙版遮蔽效果
Jan 11 jQuery
JS删除数组指定值常用方法详解
Jun 04 Javascript
小程序自定义弹框效果
Nov 16 Javascript
js实现圆形菜单选择器
Dec 03 Javascript
javascript实现滚轮轮播图片
Dec 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
php多层数组与对象的转换实例代码
2013/08/05 PHP
PHPer 需要了解的 5 个 Composer 小技巧
2014/08/18 PHP
php集成套件服务器xampp安装使用教程(适合第一次玩PHP的新手)
2015/06/03 PHP
PHP实现多维数组转字符串和多维数组转一维数组的方法
2015/08/08 PHP
php 生成Tab键或逗号分隔的CSV
2016/09/24 PHP
js下获取div中的数据的原理分析
2010/04/07 Javascript
基于jQuery架构javascript基础体系
2011/01/01 Javascript
javascript中的对象创建 实例附注释
2011/02/08 Javascript
raphael.js绘制中国地图 地图绘制方法
2014/02/12 Javascript
玩转方法:call和apply
2014/05/08 Javascript
实现网页页面跳转的几种方法(meta标签、js实现、php实现)
2014/05/20 Javascript
js Calender控件使用详解
2015/01/05 Javascript
如何使用jquery实现文字上下滚动效果
2016/10/12 Javascript
jQuery插件FusionCharts绘制的3D环饼图效果示例【附demo源码】
2017/04/02 jQuery
jQuery实现滚动效果
2017/11/17 jQuery
React.js组件实现拖拽排序组件功能过程解析
2020/04/27 Javascript
vue cli4.0项目引入typescript的方法
2020/07/17 Javascript
解决vux 中popup 组件Mask 遮罩在最上层的问题
2020/11/03 Javascript
python基于xml parse实现解析cdatasection数据
2014/09/30 Python
python通过shutil实现快速文件复制的方法
2015/03/14 Python
详细解析Python中的变量的数据类型
2015/05/13 Python
Python中在脚本中引用其他文件函数的实现方法
2016/06/23 Python
用Pytorch训练CNN(数据集MNIST,使用GPU的方法)
2019/08/19 Python
Python数组并集交集补集代码实例
2020/02/18 Python
Python新手学习raise用法
2020/06/03 Python
详解python中的闭包
2020/09/07 Python
利用纯CSS3实现tab选项卡切换示例代码
2016/09/21 HTML / CSS
世界最大的私人旅行指南出版商:孤独星球
2016/08/23 全球购物
英国排名第一的最新设计师品牌手表独立零售商:TIC Watches
2016/09/24 全球购物
YSL圣罗兰美妆官方旗舰店:购买YSL口红
2018/04/16 全球购物
瑞典轮胎在线:Tirendo.se
2018/06/21 全球购物
中专生自我鉴定
2013/12/17 职场文书
2014年助理工程师工作总结
2014/11/14 职场文书
个人委托函范文
2015/01/29 职场文书
导游词怎么写
2015/02/04 职场文书
2015年组织委员工作总结
2015/04/23 职场文书