为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 相关文章推荐
JQuery1.4+ Ajax IE8 内存泄漏问题
Oct 15 Javascript
仿当当网淘宝网等主流电子商务网站商品分类导航菜单
Sep 25 Javascript
jquery简单插件制作(fn.extend)完整实例
May 24 Javascript
JavaScript探测CSS动画是否已经完成的方法
Aug 30 Javascript
Angular.js实现注册系统的实例详解
Dec 18 Javascript
简单谈谈关于 npm 5.0 的新坑
Jun 08 Javascript
基于vue1和vue2获取dom元素的方法
Mar 17 Javascript
JavaScript的Object.defineProperty详解
Jul 09 Javascript
详解如何在Node.js的httpServer中接收前端发送的arraybuffer数据
Nov 11 Javascript
详解Puppeteer前端自动化测试实践
Feb 21 Javascript
layer.open的自适应及居中及子页面标题的修改方法
Sep 05 Javascript
微信小程序实现点击按钮后修改颜色
Dec 05 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
phpcms模块开发之swfupload的使用介绍
2013/04/28 PHP
php.ini修改php上传文件大小限制的方法详解
2013/06/17 PHP
WordPress迁移时一些常见问题的解决方法整理
2015/11/24 PHP
替换php字符串中的单引号为双引号的方法
2017/02/16 PHP
获取当前网页document.url location.href区别总结
2008/05/10 Javascript
jQuery 可以拖动的div实现代码 脚本之家修正版
2009/06/26 Javascript
jQuery ReferenceError: $ is not defined 错误的处理办法
2013/05/10 Javascript
JS 添加千分位与去掉千分位的示例
2013/07/11 Javascript
Jquery获得控件值的三种方法总结
2014/02/13 Javascript
js调用后台、后台调用前台等方法总结
2014/04/17 Javascript
jQuery实现网页顶部固定导航效果代码
2015/12/24 Javascript
Javascript之面向对象--方法
2016/12/02 Javascript
JS实现的按钮点击颜色切换功能示例
2017/10/19 Javascript
彻底理解js面向对象之继承
2018/02/04 Javascript
详解为生产环境编译Angular2应用的方法
2018/12/10 Javascript
Vue2(三)实现子菜单展开收缩,带动画效果实现方法
2019/04/28 Javascript
jQuery实现的分页插件完整示例
2020/05/26 jQuery
使用PYTHON接收多播数据的代码
2012/03/01 Python
python利用beautifulSoup实现爬虫
2014/09/29 Python
Python实现去除代码前行号的方法
2015/03/10 Python
Python设计模式之备忘录模式原理与用法详解
2019/01/15 Python
Python File(文件) 方法整理
2019/02/18 Python
python之列表推导式的用法
2019/11/29 Python
Python matplotlib 绘制双Y轴曲线图的示例代码
2020/06/12 Python
使用keras内置的模型进行图片预测实例
2020/06/17 Python
微信html5页面调用第三方位置导航的示例
2018/03/14 HTML / CSS
C&A巴西网上商店:时尚、衣服、手机和鞋子
2020/06/07 全球购物
艺术系应届生的自我评价
2013/10/19 职场文书
教师绩效考核方案
2014/01/21 职场文书
个人充满哲理的自我评价
2014/02/20 职场文书
职务说明书范文
2014/05/07 职场文书
安全宣传标语
2014/06/10 职场文书
党员干部群众路线教育实践活动个人对照检查材料
2014/09/23 职场文书
预备党员对照检查材料思想汇报
2014/09/24 职场文书
2014年保密工作总结
2014/11/22 职场文书
酒桌上的开场白
2015/06/01 职场文书