为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 keypress,keyup,onpropertychange键盘事件
Jun 25 Javascript
根据当前时间在jsp页面上显示上午或下午
Aug 18 Javascript
JS按回车键实现登录的方法
Aug 25 Javascript
深入理解JavaScript中的对象复制(Object Clone)
May 18 Javascript
jQuery实现加入收藏夹功能(主流浏览器兼职)
Dec 24 Javascript
Vue按需加载的具体实现
Dec 02 Javascript
js取小数点后两位四种方法
Jan 18 Javascript
详解iframe跨域的几种常用方法(小结)
Apr 29 Javascript
react 组件传值的三种方法
Jun 03 Javascript
微信小程序图片加载失败时替换为默认图片的方法
Dec 09 Javascript
React 条件渲染最佳实践小结(7种)
Sep 27 Javascript
vue组件vue-esign实现电子签名
Apr 21 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&amp;&amp;mysql)三
2006/10/09 PHP
PHP中的日期处理方法集锦
2007/01/02 PHP
PHP实现的Redis多库选择功能单例类
2017/07/27 PHP
javascript onkeydown,onkeyup,onkeypress,onclick,ondblclick
2009/02/04 Javascript
公共js在页面底部加载的注意事项介绍
2013/07/18 Javascript
浅析用prototype定义自己的方法
2013/11/14 Javascript
jquery ui bootstrap 实现自定义风格
2014/11/14 Javascript
基于javascript html5实现3D翻书特效
2016/03/14 Javascript
jQuery实现CheckBox全选、全不选功能
2017/01/11 Javascript
详解能在多种前端框架下使用的表格控件
2017/01/11 Javascript
AngularJS表单验证功能分析
2017/05/26 Javascript
Vue实现调节窗口大小时触发事件动态调节更新组件尺寸的方法
2018/09/15 Javascript
ajax与jsonp的区别及用法
2018/10/16 Javascript
微信小程序中的canvas 文字断行和省略号显示功能的处理方法
2018/11/14 Javascript
vue.js实现三级菜单效果
2019/10/19 Javascript
VUE实现自身整体组件销毁的示例代码
2020/01/13 Javascript
原生js无缝轮播插件使用详解
2020/03/09 Javascript
Python中的赋值、浅拷贝、深拷贝介绍
2015/03/09 Python
在Django的模型和公用函数中使用惰性翻译对象
2015/07/27 Python
解决Python中pandas读取*.csv文件出现编码问题
2019/07/12 Python
Python3实现二叉树的最大深度
2019/09/30 Python
Tkinter中复选菜单是否被选中的判断与设置方式
2020/03/04 Python
Python 多进程原理及实现
2020/12/21 Python
canvas实现图片马赛克的示例代码
2018/03/26 HTML / CSS
美国时尚假发购物网站:Wigsbuy
2019/04/06 全球购物
英国老牌潮鞋店:Offspring
2019/08/19 全球购物
《槐乡五月》教学反思
2014/04/25 职场文书
会议欢迎标语
2014/06/30 职场文书
商铺门前三包责任书
2014/07/25 职场文书
音乐之声音乐广播稿
2014/09/10 职场文书
党员干部反四风对照检查材料思想汇报
2014/09/14 职场文书
2014年教务工作总结
2014/12/03 职场文书
2015年电话销售工作总结范文
2015/04/20 职场文书
三八妇女节致辞
2015/07/31 职场文书
Pytest之测试命名规则的使用
2021/04/16 Python
Python 图片添加美颜效果
2022/04/28 Python