为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 相关文章推荐
javascript addBookmark 加入收藏 多浏览器兼容
Aug 15 Javascript
javascript中类的定义及其方式(《javascript高级程序设计》学习笔记)
Jul 04 Javascript
javascript使用smipleChart实现简单图表
Jan 02 Javascript
浅谈jquery事件处理
Apr 24 Javascript
浅析javascript的return语句
Dec 15 Javascript
jQuery实现元素拖拽并cookie保存顺序的方法
Feb 20 Javascript
jQuery原理系列-常用Dom操作详解
Jun 07 Javascript
Vue2.0实现将页面中表格数据导出excel的实例
Aug 09 Javascript
vuex 动态注册方法 registerModule的实现
Jul 03 Javascript
JavaScript实现留言板案例
Mar 17 Javascript
electron踩坑之remote of undefined的解决
Oct 06 Javascript
vue 递归组件的简单使用示例
Jan 14 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中SQL注入攻击与XSS攻击
2012/06/10 PHP
判断php数组是否为索引数组的实现方法
2013/06/13 PHP
解析php下载远程图片函数 可伪造来路
2013/06/25 PHP
php中url传递中文字符,特殊危险字符的解决方法
2013/08/17 PHP
PHP错误Parse error: syntax error, unexpected end of file in test.php on line 12解决方法
2014/06/23 PHP
php强大的时间转换函数strtotime
2016/02/18 PHP
PHP实现对数组分页处理实例详解
2017/02/07 PHP
PHP实现微信提现(企业付款到零钱)
2019/08/01 PHP
JQuery 拾色器插件发布-jquery.icolor.js
2010/10/20 Javascript
js TextArea的选中区域处理
2010/12/28 Javascript
JQuery对checkbox操作 (循环获取)
2011/05/20 Javascript
jQuery插件开发基础简单介绍
2013/01/07 Javascript
jquery获取radio值(单选组radio)
2014/10/16 Javascript
微信小程序之ES6与事项助手的功能实现
2016/11/30 Javascript
Vue.js第三天学习笔记(计算属性computed)
2016/12/01 Javascript
微信小程序 支付简单实例及注意事项
2017/01/06 Javascript
jQuery基于事件控制实现点击显示内容下拉效果
2017/03/07 Javascript
JavaScript通过mouseover()实现图片变大效果的示例
2017/12/20 Javascript
Vue+Django项目部署详解
2019/05/30 Javascript
[02:07]2017国际邀请赛中国区预选赛直邀战队前瞻
2017/06/23 DOTA
[01:06:19]DOTA2-DPC中国联赛定级赛 LBZS vs SAG BO3第二场 1月8日
2021/03/11 DOTA
使用python编写简单的小程序编译成exe跑在win10上
2018/01/15 Python
pygame游戏之旅 如何制作游戏障碍
2018/11/20 Python
Python3.7 新特性之dataclass装饰器
2019/05/27 Python
python 随机生成10位数密码的实现代码
2019/06/27 Python
Python将列表中的元素转化为数字并排序的示例
2019/12/25 Python
keras获得某一层或者某层权重的输出实例
2020/01/24 Python
keras中的backend.clip用法
2020/05/22 Python
Java如何读取CLOB字段
2013/10/10 面试题
销售心得体会
2014/01/02 职场文书
30岁生日感言
2014/01/25 职场文书
教师辞职书范文
2015/02/26 职场文书
2015年信贷员工作总结
2015/04/28 职场文书
赞助商致辞
2015/07/30 职场文书
2016春季小学开学寄语
2015/12/03 职场文书
关于Spring配置文件加载方式变化引发的异常详解
2022/01/18 Java/Android