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 相关文章推荐
客户端限制只能上传jpg格式图片的js代码
Dec 09 Javascript
使用原生javascript创建通用表单验证——更锋利的使用dom对象
Sep 13 Javascript
JS判断移动端访问设备并加载对应CSS样式
Jun 13 Javascript
javaScript中两个等于号和三个等于号之间的区别介绍
Jun 27 Javascript
浏览器缩放检测的js代码
Sep 28 Javascript
JS实现的Select三级下拉菜单代码
Aug 20 Javascript
微信小程序canvas写字板效果及实例
Jun 15 Javascript
React Native 图片查看组件的方法
Mar 01 Javascript
在vue项目中引用Iview的方法
Sep 14 Javascript
浅析vue插槽和作用域插槽的理解
Apr 22 Javascript
JavaScript函数式编程(Functional Programming)纯函数用法分析
May 22 Javascript
Vue动态面包屑功能的实现方法
Jul 01 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脚本数据库功能详解(中)
2006/10/09 PHP
一个简单的php实现的MySQL数据浏览器
2007/03/11 PHP
关于crontab的使用详解
2013/06/24 PHP
php调用新浪短链接API的方法
2014/11/08 PHP
php代码架构的八点注意事项
2016/01/25 PHP
php阳历转农历优化版
2016/08/08 PHP
tp5(thinkPHP5)框架连接数据库的方法示例
2018/12/24 PHP
用一段js程序来实现动画功能
2007/03/06 Javascript
用JTrackBar实现的模拟苹果风格的滚动条
2007/08/06 Javascript
JavaScript 版本自动生成文章摘要
2008/07/23 Javascript
给ListBox添加双击事件示例代码
2013/12/02 Javascript
jquery序列化form表单使用ajax提交后处理返回的json数据
2014/03/03 Javascript
jQuery中:password选择器用法实例
2015/01/03 Javascript
JavaScript事件委托用法分析
2015/01/24 Javascript
js光标定位文本框回车表单提交问题的解决方法
2015/05/11 Javascript
javascript实现获取服务器时间
2015/05/19 Javascript
详解JavaScript中的forEach()方法的使用
2015/06/08 Javascript
Javascript之面向对象--封装
2016/12/02 Javascript
js实现移动端编辑添加地址【模仿京东】
2017/04/28 Javascript
浅谈Vue.js路由管理器 Vue Router
2018/08/16 Javascript
微信小程序自定义联系人弹窗
2020/05/26 Javascript
Node.JS如何实现JWT原理
2020/09/18 Javascript
Python实现对字符串的加密解密方法示例
2017/04/29 Python
基于Python os模块常用命令介绍
2017/11/03 Python
python中将正则过滤的内容输出写入到文件中的实例
2018/10/21 Python
python 构造三维全零数组的方法
2018/11/12 Python
python for 循环获取index索引的方法
2019/02/01 Python
Python中SQLite如何使用
2020/05/27 Python
Python使用jupyter notebook查看ipynb文件过程解析
2020/06/02 Python
初中生三年学习生活的自我评价
2013/11/03 职场文书
七匹狼男装广告词
2014/03/21 职场文书
学生会宣传部部长竞选演讲稿
2014/04/25 职场文书
意外死亡赔偿协议书
2014/10/14 职场文书
企业整改报告范文
2014/11/08 职场文书
员工家属慰问信
2015/03/24 职场文书
Mysql - 常用函数 每天积极向上
2021/04/05 MySQL