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弹出对话框返回值代码(asp.net后台)
Dec 28 Javascript
javascript之典型高阶函数应用介绍
Jan 10 Javascript
js控制淡入淡出示例代码
Nov 12 Javascript
jQuery语法小结(超实用)
Dec 31 Javascript
jquery validate表单验证插件
Sep 06 Javascript
深入理解jQuery()方法的构建原理
Dec 05 Javascript
jquery插件锦集【推荐】
Dec 16 Javascript
JavaScript实现打印星型金字塔功能实例分析
Sep 27 Javascript
vuejs实现ready函数加载完之后执行某个函数的方法
Aug 31 Javascript
详解JavaScript中的强制类型转换
Apr 15 Javascript
关于Vue中axios的封装实例详解
Oct 20 Javascript
element-ui 文件上传修改文件名的方法示例
Nov 05 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 htmlspecialchars加强版
2010/02/16 PHP
php基础教程 php内置函数实例教程
2012/08/21 PHP
PHP中fwrite与file_put_contents性能测试代码
2013/08/02 PHP
老生常谈ThinkPHP中的行为扩展和插件(推荐)
2017/05/05 PHP
[原创]php正则删除html代码中class样式属性的方法
2017/05/24 PHP
该如何加载google-analytics(或其他第三方)的JS
2010/05/13 Javascript
使用JavaScript动态设置样式实现代码(2)
2013/01/25 Javascript
jQuery 获取多选框的值及多选框中文的函数
2016/05/16 Javascript
javascript 数据存储的常用函数总结
2017/06/01 Javascript
jQuery+vue.js实现的九宫格拼图游戏完整实例【附源码下载】
2017/09/12 jQuery
JS设计模式之惰性模式(二)
2017/09/29 Javascript
js点击时关闭该范围下拉菜单之外的菜单方法
2018/01/11 Javascript
浅谈Vue 性能优化之深挖数组
2018/12/11 Javascript
详解微信小程序-canvas绘制文字实现自动换行
2019/04/26 Javascript
Vue最新防抖方案(必看篇)
2019/10/30 Javascript
开发Node CLI构建微信小程序脚手架的示例
2020/03/27 Javascript
vue实现登录、注册、退出、跳转等功能
2020/12/23 Vue.js
[02:56]《DAC最前线》之国外战队抵达上海备战亚洲邀请赛
2015/01/28 DOTA
Python实现批量执行同目录下的py文件方法
2019/01/11 Python
python基于递归解决背包问题详解
2019/07/03 Python
python中selenium操作下拉滚动条的几种方法汇总
2019/07/14 Python
python按键按住不放持续响应的实例代码
2019/07/17 Python
Django中的静态文件管理过程解析
2019/08/01 Python
Python递归实现打印多重列表代码
2020/02/27 Python
python怎么对数字进行过滤
2020/07/05 Python
Django怎么在admin后台注册数据库表
2020/11/14 Python
使用iframe+postMessage实现页面跨域通信的示例代码
2020/01/14 HTML / CSS
Gina Bacconi官网:吉娜贝康尼连衣裙和礼服
2018/04/24 全球购物
同事打架检讨书
2014/02/04 职场文书
求职自荐信怎么写
2014/03/06 职场文书
2015年学校安全管理工作总结
2015/05/11 职场文书
2015七夕情人节宣传语
2015/07/14 职场文书
2016年“12.4”法制宣传日活动总结
2016/04/01 职场文书
JavaScript 防篡改对象的用法示例
2021/04/24 Javascript
Matlab如何实现矩阵复制扩充
2021/06/02 Python
关于React Native 无法链接模拟器的问题
2021/06/21 Javascript