为JavaScript添加重载函数的辅助方法


Posted in Javascript onJuly 04, 2010

JavaScript的重载函数,一般是靠对arguments判断来操作的。
比如:

var afunc = function() { 
args = arguments; 
if(args.length == 1) { 
console.log(1); 
}else if(args.length == 2) { 
console.log(2); 
}else if (args.length == 3) { 
console.log(3); 
} 
}

可以想象如果重载数量多的时候,要有多少的if-else判断啊(事实上重载数量应该不会太多吧)。
如果要对js函数进行重载,代码量肯定是多的。那么能不能想办法使代码清晰点,再减少那些相同代码的书写呢?
这就是我写篇文章和相关代码的起因了。
惯例先上代码:
/** KOverLoad 
一个创建重载函数的辅助方法。 
其实这个方法只是帮忙整理了参数不同的情况下的重载方法。 
如果还要对参数类型进行判断重载的话,请在提供的方法中自己实现。 
@Author ake 2010-05-02 
@weblog http://www.cnblogs.com/akecn 
*/ 
var KOverLoad = function(scope) { 
this.scope = scope || window; //默认添加方法到这个对象中。同时添加的方法的this指向该对象。 
this.list = {}; //存放重载函数的地方。 
return this; 
}; 
KOverLoad.prototype = { 
//添加一个重载的方法。 
//@param arg<Function> 重载的方法。 
add:function(arg) { 
if(typeof arg == "function") { 
this.list[arg.length] = arg; //以参数数量做标识存储重载方法。很显然如果你的重载方法参数数量 
} 
return this; 
}, 
//添加完所有的重载函数以后,调用该方法来创建重载函数。 
//@param fc<String> 重载函数的方法名。 
load:function(fc) { 
var self = this, args, len; 
this.scope[fc] = function() { //将指定作用域的指定方法 设为重载函数。 
args = Array.prototype.slice.call(arguments, 0); //将参数转换为数组。 
len = args.length; 
if(self.list[len]) { //根据参数数量调用符合的重载方法。 
self.list[len].apply(self.scope, args); //这里指定了作用域和参数。 
}else{ 
throw new Error("undefined overload type"); 
} 
} 
} 
};

使用 方法是我觉得比较清晰的方法:
//这是可选的作用对象。
var s =function(){} 
s.prototype = { 
init:function() { 
console.log(); 
} 
}

//构造函数的参数可以是Object类型的或者其他合法的类型,如果不指定,则注册到window对象中,并且作用域也是window。其实就是添加该重载方法到什么地方而已。
new KOverLoad(s.prototype).add(function(a) { 
console.log("one",a,this) 
}) 
 .add(function(a,b) { 
console.log("two",a,b,this) 
}) 
 .add(function(a,b,c) { 
console.log("three",a,b,c,this) 
}) 
 .add(function(a,b,c,d) { 
console.log("four",a,b,c,d,this) 
}) 
 .load("func"); //在这里的参数就是要创建的重载函数的方法名称。

完成以上操作以后,s.func就是一个重载函数。
我们可以这样调用重载函数:
var t = new s(); 
t.func();//抛出错误异常。因为没有指定零参数时的函数 
t.func(”o”);//one o Object {} 
t.func(1,2);//two 1 2 Object {}

简单的代码而已,如果各位有建议或者意见,欢迎留言指教。
Javascript 相关文章推荐
jQuery contains过滤器实现精确匹配使用方法
Apr 12 Javascript
jQuery之折叠面板的深入解析
Jun 19 Javascript
js open() 与showModalDialog()方法使用介绍
Sep 10 Javascript
TypeScript Type Innference(类型判断)
Mar 10 Javascript
基于jPlayer三分屏的制作方法
Dec 21 Javascript
简单易懂的天气插件(代码分享)
Feb 04 Javascript
JS实现最简单的冒泡排序算法
Feb 15 Javascript
vue 2.0路由之路由嵌套示例详解
May 08 Javascript
mui框架移动开发初体验详解
Oct 11 Javascript
angularJs中跳转到指定的锚点实例($anchorScroll)
Aug 31 Javascript
Vue项目中使用better-scroll实现一个轮播图自动播放功能
Dec 03 Javascript
jenkins自动构建发布vue项目的方法步骤
Jan 04 Vue.js
location.href语句与火狐不兼容的问题
Jul 04 #Javascript
JQuery从头学起第二讲
Jul 04 #Javascript
JQuery从头学起第一讲
Jul 04 #Javascript
js弹窗代码 可以指定弹出间隔
Jul 03 #Javascript
动态载入/删除/更新外部 JavaScript/Css 文件的代码
Jul 03 #Javascript
一个原生的用户等级的进度条
Jul 03 #Javascript
清空上传控件input file的值
Jul 03 #Javascript
You might like
PHP JSON 数据解析代码
2010/05/26 PHP
php可变长参数处理函数详解
2017/02/22 PHP
javascript读取RSS数据
2007/01/20 Javascript
JavaScript eval() 函数介绍及应用示例
2014/07/29 Javascript
JavaScript中遍历对象的property的3种方法介绍
2014/12/30 Javascript
angularJS 入门基础
2015/02/09 Javascript
javascript函数自动执行常用方法汇总
2016/03/28 Javascript
js获取鼠标点击的对象,点击另一个按钮删除该对象的实现代码
2016/05/13 Javascript
JavaScript判断数组重复内容的两种方法(推荐)
2016/06/06 Javascript
一个简单不报错的summernote 图片上传案例
2016/07/11 Javascript
AngularJS  ng-table插件设置排序
2016/09/21 Javascript
利用angular.copy取消变量的双向绑定与解析
2016/11/25 Javascript
jQuery纵向导航菜单效果实现方法
2016/12/19 Javascript
原生js实现回复评论功能
2017/01/18 Javascript
Canvas实现放射线动画效果
2017/02/15 Javascript
详解在vue-cli项目中使用mockjs(请求数据删除数据)
2017/10/23 Javascript
浅谈vue自定义全局组件并通过全局方法 Vue.use() 使用该组件
2017/12/07 Javascript
在 Angular中 使用 Lodash 的方法
2018/02/11 Javascript
浅谈Vue 数据响应式原理
2018/05/07 Javascript
JavaScript+Canvas实现彩色图片转换成黑白图片的方法分析
2018/07/31 Javascript
VScode格式化ESlint方法(最全最好用方法)
2019/09/10 Javascript
JS常用正则表达式超全集(密码强度校验,金额校验,IE版本,IPv4,IPv6校验)
2020/02/03 Javascript
Vue.js中使用Vuex实现组件数据共享案例
2020/07/31 Javascript
pyramid配置session的方法教程
2013/11/27 Python
Python使用pylab库实现绘制直方图功能示例
2018/06/01 Python
python文件绝对路径写法介绍(windows)
2019/12/25 Python
python GUI库图形界面开发之PyQt5信号与槽机制、自定义信号基础介绍
2020/02/25 Python
python基于socket模拟实现ssh远程执行命令
2020/12/05 Python
HTML5上传文件显示进度的实现代码
2012/08/30 HTML / CSS
HTML5 History API 实现无刷新跳转
2016/01/11 HTML / CSS
英国赛车、汽车改装和摩托车零件购物网站:Demon Tweeks
2018/10/29 全球购物
大三在校生电子商务求职信
2013/10/29 职场文书
精细化工应届生求职信
2013/11/17 职场文书
党性观念心得体会
2014/09/03 职场文书
焦裕禄纪念馆观后感
2015/06/09 职场文书
Python实现聚类K-means算法详解
2022/07/15 Python