为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 相关文章推荐
js 自动播放的实例代码
Nov 19 Javascript
Blocksit插件实现瀑布流数据无限( 异步)加载
Jun 20 Javascript
javaScript基础语法介绍
Feb 28 Javascript
jquery模拟多级复选框效果的简单实例
Jun 08 Javascript
jQuery EasyUI编辑DataGrid用combobox实现多级联动
Aug 29 Javascript
详解angular中如何监控dom渲染完毕
Jan 03 Javascript
JS 组件系列之BootstrapTable的treegrid功能
Jun 16 Javascript
jQuery动态移除与增加onclick属性的方法详解
Jun 07 jQuery
JS实现自定义弹窗功能
Aug 08 Javascript
angular中两种表单的区别(响应式和模板驱动表单)
Dec 06 Javascript
JS实现点击下拉列表文本框中出现对应的网址,点击跳转按钮实现跳转
Nov 25 Javascript
JS性能优化实现方法及优点进行
Aug 30 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
WINDOWS 2000下使用ISAPI方式安装PHP
2006/09/05 PHP
PHP5.0正式发布 不完全兼容PHP4 新增多项功能
2006/10/09 PHP
php中的三元运算符使用说明
2011/07/03 PHP
php的XML文件解释类应用实例
2014/09/22 PHP
Yii2框架实现数据库常用操作总结
2017/02/08 PHP
对laravel的csrf 防御机制详解,及form中csrf_token()的存在介绍
2019/10/24 PHP
Javascript 表单之间的数据传递代码
2008/12/04 Javascript
javascript中&quot;/&quot;运算符常见错误
2010/10/13 Javascript
function foo的原型与prototype属性解惑
2010/11/19 Javascript
javascript中强制执行toString()具体实现
2013/04/27 Javascript
js计算两个时间之间天数差的实例代码
2013/11/19 Javascript
修复bash漏洞的shell脚本分享
2014/12/31 Javascript
为JS扩展Array.prototype.indexOf引发的问题及解决办法
2015/01/21 Javascript
用JavaScript显示浏览器客户端信息的超相近教程
2015/06/18 Javascript
jQuery插件imgPreviewQs实现上传图片预览
2016/01/15 Javascript
使用AngularJS 跨站请求如何解决jsonp请求问题
2017/01/16 Javascript
Ext JS 实现建议词模糊动态搜索功能
2017/05/13 Javascript
jquery ajax异步提交表单数据的方法
2017/10/27 jQuery
js实现带箭头的进度流程
2020/03/26 Javascript
python实现堆栈与队列的方法
2015/01/15 Python
Python多线程编程(二):启动线程的两种方法
2015/04/05 Python
Python数据分析之真实IP请求Pandas详解
2016/11/18 Python
Flask数据库迁移简单介绍
2017/10/24 Python
详解Django之admin组件的使用和源码剖析
2018/05/04 Python
python3学习之Splash的安装与实例教程
2018/07/09 Python
python对接ihuyi实现短信验证码发送
2020/05/10 Python
canvas实现图片马赛克的示例代码
2018/03/26 HTML / CSS
欧洲最大的婴幼儿服装及内衣公司:Petit Bateau(小帆船)
2016/08/16 全球购物
Fossil美国官网:Fossil手表、手袋、珠宝及配件
2017/02/01 全球购物
葡萄牙航空官方网站:TAP Air Portugal
2019/10/31 全球购物
电子商务毕业生求职信
2013/11/10 职场文书
实习生单位鉴定意见
2013/12/04 职场文书
找工作最新求职信
2013/12/22 职场文书
幼儿园教师考核评语
2014/12/31 职场文书
2015清明节祭奠英烈寄语大全
2015/03/04 职场文书
党员个人承诺书
2015/04/27 职场文书