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 相关文章推荐
IE浏览器PNG图片透明效果代码
Sep 02 Javascript
JavaScript.Encode手动解码技巧
Jul 14 Javascript
jquery的ajax跨域请求原理和示例
May 08 Javascript
kindeditor编辑器点中图片滚动条往上顶的bug
Jul 05 Javascript
JavaScript保存并运算页面中数字类型变量的写法
Jul 06 Javascript
chrome下判断点击input上标签还是其余标签的实现方法
Sep 18 Javascript
JS无缝滚动效果实现方法分析
Dec 21 Javascript
jquery将标签元素的高设为屏幕的百分比
Apr 19 jQuery
解决vue-cli项目打包出现空白页和路径错误的问题
Sep 04 Javascript
详解IOS微信上Vue单页面应用JSSDK签名失败解决方案
Nov 14 Javascript
Element-ui自定义table表头、修改列标题样式、添加tooltip、:render-header使用
Apr 11 Javascript
深入解析微信小程序开发中遇到的几个小问题
Jul 11 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实现Socket服务器的代码
2008/04/03 PHP
jQuery 获取对象 根据属性、内容匹配, 还有表单元素匹配
2010/05/31 Javascript
如何使用jquery动态加载js,css文件实现代码
2013/04/03 Javascript
利用JS进行图片的切换即特效展示图片
2013/12/03 Javascript
jQuery(js)获取文字宽度(显示长度)示例代码
2013/12/31 Javascript
jquery鼠标放上去显示悬浮层即弹出定位的div层
2014/04/25 Javascript
js动态改变select选择变更option的index值示例
2014/07/10 Javascript
Node.js中安全调用系统命令的方法(避免注入安全漏洞)
2014/12/05 Javascript
JavaScript前补零操作实例
2015/03/11 Javascript
javascript通过获取html标签属性class实现多选项卡的方法
2015/07/27 Javascript
微信小程序 自定义消息提示框
2017/08/06 Javascript
浅谈webpack对样式的处理
2018/01/05 Javascript
js中的闭包实例展示
2018/11/01 Javascript
Node.js实现一个HTTP服务器的方法示例
2019/05/13 Javascript
少女风vue组件库的制作全过程
2019/05/15 Javascript
js函数和this用法实例分析
2020/03/13 Javascript
[00:33]2016完美“圣”典风云人物:Sccc宣传片
2016/12/03 DOTA
Python3.x版本中新的字符串格式化方法
2015/04/24 Python
详解使用Python处理文件目录的相关方法
2015/10/16 Python
Python数据类型之Set集合实例详解
2019/05/07 Python
Python数据类型之列表和元组的方法实例详解
2019/07/08 Python
PyTorch和Keras计算模型参数的例子
2020/01/02 Python
h5页面背景图很长要有滚动条滑动效果的实现
2021/01/27 HTML / CSS
丝芙兰巴西官方商城:SEPHORA巴西
2016/10/31 全球购物
美国第二大连锁药店:Rite Aid
2019/04/03 全球购物
迪卡侬比利时官网:Decathlon比利时
2019/12/28 全球购物
沙特阿拉伯排名第一的在线时尚购物应用程序:1Zillion
2020/08/08 全球购物
建筑工程毕业生自我鉴定
2014/01/14 职场文书
个人自我评价范文
2014/02/05 职场文书
四年大学自我鉴定
2014/02/17 职场文书
ktv服务员岗位职责
2015/02/09 职场文书
文案策划岗位职责
2015/02/11 职场文书
刘胡兰观后感
2015/06/16 职场文书
昆虫记读书笔记
2015/06/26 职场文书
MySQL 存储过程的优缺点分析
2021/05/20 MySQL
RestTemplate如何通过HTTP Basic Auth认证示例说明
2022/03/17 Java/Android