为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 相关文章推荐
baidu博客的编辑友情链接的新的层窗口!经典~支持【FF】
Feb 09 Javascript
javascript下4个跨浏览器必备的函数
Mar 07 Javascript
jQuery选择器源码解读(三):tokenize方法
Mar 31 Javascript
JavaScript 里的类数组对象
Apr 08 Javascript
JS实现简洁、全兼容的拖动层实例
May 13 Javascript
不用一句js代码初始化组件
Jan 27 Javascript
深入理解JS中的substr和substring
Apr 26 Javascript
json对象与数组以及转换成js对象的简单实现方法
Jun 24 Javascript
浅谈js控制li标签排序问题 js调用php函数的方法
Oct 16 Javascript
使用Node.js实现简易MVC框架的方法
Aug 07 Javascript
基于js 各种排序方法和sort方法的区别(详解)
Jan 03 Javascript
angular4自定义表单控件[(ngModel)]的实现
Nov 23 Javascript
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
玩家交还《星际争霸》原始码光盘 暴雪报以厚礼
2017/05/05 星际争霸
php中随机函数mt_rand()与rand()性能对比分析
2014/12/01 PHP
Yii实现MySQL多数据库和读写分离实例分析
2014/12/03 PHP
PHP中curl_setopt函数用法实例分析
2015/04/16 PHP
PHP合并两个或多个数组的方法
2019/01/20 PHP
使用Zookeeper分布式部署PHP应用程序
2019/03/15 PHP
javascript在一段文字中的光标处插入其他文字
2007/08/26 Javascript
js function定义函数使用心得
2010/04/15 Javascript
JS防止用户多次提交的简单代码
2013/08/01 Javascript
node.js中的http.response.writeHead方法使用说明
2014/12/14 Javascript
jQuery实现鼠标经过提示信息的地图热点效果
2015/04/26 Javascript
JS获取子窗口中返回的数据实现方法
2016/05/28 Javascript
JS+CSS3模拟溢出滚动效果
2016/08/12 Javascript
vue的props实现子组件随父组件一起变化
2016/10/27 Javascript
canvas绘制七巧板
2017/02/03 Javascript
vue使用vue-cli快速创建工程
2017/07/28 Javascript
vue项目上传Github预览的实现示例
2018/11/06 Javascript
记录一次完整的react hooks实践
2019/03/11 Javascript
Vue+Koa2 打包后进行线上部署的教程详解
2019/07/31 Javascript
[02:28]DOTA2英雄基础教程 狼人
2013/12/23 DOTA
[05:36]DOTA2 2015国际邀请赛中国区预选赛第四日TOP10
2015/05/29 DOTA
python连接sql server乱码的解决方法
2013/01/28 Python
django模型类中,null=True,blank=True用法说明
2020/07/09 Python
Python 实现一个计时器
2020/07/28 Python
python画图时设置分辨率和画布大小的实现(plt.figure())
2021/01/08 Python
python解包概念及实例
2021/02/17 Python
解决pytorch 保存模型遇到的问题
2021/03/03 Python
很酷的小工具和电子产品商城:GearBest
2016/11/19 全球购物
交通安全教育制度
2014/02/02 职场文书
供货协议书范本
2014/04/22 职场文书
大学活动总结模板
2014/07/10 职场文书
起诉意见书范文
2015/05/19 职场文书
2015年学校政教工作总结
2015/07/20 职场文书
导游词之南京中山陵
2019/11/27 职场文书
解决sql server 数据库,sa用户被锁定的问题
2021/06/11 SQL Server
MySQL 中如何归档数据的实现方法
2022/03/16 SQL Server