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 相关文章推荐
列表内容的选择
Jun 30 Javascript
JQuery扩展插件Validate—6 radio、checkbox、select的验证
Sep 05 Javascript
js 获取元素在页面上的偏移量的方法汇总
Apr 13 Javascript
Node.js中使用socket创建私聊和公聊聊天室
Nov 19 Javascript
jquery zTree异步加载、模糊搜索简单实例分享
Mar 24 Javascript
AngularJS 自定义指令详解及示例代码
Aug 17 Javascript
jQuery弹出窗口打开链接的实现代码
Dec 24 Javascript
JavaScript基于Dom操作实现查找、修改HTML元素的内容及属性的方法
Jan 20 Javascript
原生JS改变透明度实现轮播效果
Mar 24 Javascript
vue项目base64字符串转图片的实现代码
Jul 13 Javascript
js指定日期增加指定月份的实现方法
Dec 19 Javascript
微信小程序下拉框搜索功能的实现方法
Jul 31 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
Zend的MVC机制使用分析(一)
2013/05/02 PHP
php+webSoket实现聊天室示例代码(附源码)
2017/02/17 PHP
php格式文件打开的四种方法
2018/02/24 PHP
PHP大文件分割分片上传实现代码
2020/12/09 PHP
javascript字典探测用户名工具
2006/10/05 Javascript
javascript 选择文件夹对话框(web)
2009/07/07 Javascript
JQuery 绑定事件时传递参数的实现方法
2009/10/13 Javascript
js中的for如何实现foreach中的遍历
2014/05/31 Javascript
轻松创建nodejs服务器(10):处理POST请求
2014/12/18 NodeJs
JavaScript动态修改背景颜色的方法
2015/04/16 Javascript
NodeJs中的VM模块详解
2015/05/06 NodeJs
Javascript递归打印Document层次关系实例分析
2015/05/15 Javascript
Angular 项目实现国际化的方法
2018/01/08 Javascript
Angular 4.x+Ionic3踩坑之Ionic 3.x界面传值详解
2018/03/13 Javascript
Vue v-text指令简单使用方法示例
2019/09/19 Javascript
React实现类似淘宝tab居中切换效果的示例代码
2020/06/02 Javascript
netbeans7安装python插件的方法图解
2013/12/24 Python
python读取csv文件示例(python操作csv)
2014/03/11 Python
python通过定义一个类实例作为ftp回调方法
2015/05/04 Python
python实现汉诺塔方法汇总
2016/07/25 Python
图解Python变量与赋值
2018/04/03 Python
python自动登录12306并自动点击验证码完成登录的实现源代码
2018/04/25 Python
网易2016研发工程师编程题 奖学金(python)
2019/06/19 Python
python常用排序算法的实现代码
2019/11/08 Python
tensorflow 重置/清除计算图的实现
2020/01/19 Python
python 多进程和协程配合使用写入数据
2020/10/30 Python
使用Filters滤镜弥补CSS3的跨浏览器问题以及兼容低版本IE
2013/01/23 HTML / CSS
西班牙高科技产品购物网站:MejorDeseo
2019/09/08 全球购物
俄罗斯皮肤健康中心:Pharmacosmetica.ru
2020/02/22 全球购物
AJAX应用和传统Web应用有什么不同
2013/08/24 面试题
大学生怎样写好自荐信
2014/02/25 职场文书
员工安全生产承诺书
2014/05/22 职场文书
国庆节促销广告语2014
2014/09/19 职场文书
python opencv人脸识别考勤系统的完整源码
2021/04/26 Python
MySQL数据库索引的最左匹配原则
2021/11/20 MySQL
Golang ort 中的sortInts 方法
2022/04/24 Golang