为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判断用户浏览器是否是XP SP2的IE6
Mar 08 Javascript
刷新页面实现方式总结(HTML,ASP,JS)
Nov 13 Javascript
jQuery中实现动画效果的基本操作介绍
Apr 16 Javascript
JQuery表格内容过滤的实现方法
Jul 05 Javascript
鼠标移动到图片名上,显示图片的简单实例
Jul 14 Javascript
JavaScript数组函数unshift、shift、pop、push使用实例
Aug 27 Javascript
解决微信浏览器Javascript无法使用window.location.reload()刷新页面
Jun 21 Javascript
Vue.js组件tree实现无限级树形菜单
Dec 02 Javascript
jQuery实现动态删除LI的方法
May 30 jQuery
微信小程序实现给嵌套template模板传递数据的方式总结
Dec 18 Javascript
通过cordova将vue项目打包为webapp的方法
Feb 02 Javascript
vue项目初始化到登录login页面的示例
Oct 31 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
Thinkphp模板中使用自定义函数的方法
2012/09/23 PHP
几个比较实用的JavaScript 测试及效验工具
2010/04/18 Javascript
jQuery EasyUI API 中文文档 - NumberSpinner数值微调器使用介绍
2011/10/21 Javascript
javascript生成随机大小写字母的方法
2014/02/20 Javascript
jQuery新的事件绑定机制on()示例应用
2014/07/18 Javascript
javascript复制粘贴与clipboardData的使用
2014/10/16 Javascript
原生javascript实现隔行换色
2015/01/04 Javascript
js+css实现导航效果实例
2015/02/10 Javascript
jQuery实现提交按钮点击后变成正在处理字样并禁止点击的方法
2015/03/24 Javascript
JavaScript 实现完美兼容多浏览器的复制功能代码
2015/04/28 Javascript
JS中setTimeout的巧妙用法前端函数节流
2016/03/24 Javascript
JS判断字符串变量是否含有某个字串的实现方法
2016/06/03 Javascript
Bootstrap编写一个在当前网页弹出可关闭的对话框 非弹窗
2016/06/30 Javascript
浅谈Web页面向后台提交数据的方式和选择
2016/09/23 Javascript
常用的js方法合集
2017/03/10 Javascript
Vue2.0如何发布项目实战
2017/07/27 Javascript
vue-router 权限控制的示例代码
2017/09/21 Javascript
JS实现元素上下左右移动效果
2017/10/18 Javascript
利用10行js代码实现上下滚动公告效果
2017/12/08 Javascript
浅谈Node.js 沙箱环境
2018/05/15 Javascript
菊花转动的jquery加载动画效果
2018/08/19 jQuery
vue中使用heatmapjs的示例代码(结合百度地图)
2018/09/05 Javascript
如何进行微信公众号开发的本地调试的方法
2019/06/16 Javascript
如何对react hooks进行单元测试的方法
2019/08/14 Javascript
原生js实现瀑布流效果
2020/03/09 Javascript
tensorflow实现KNN识别MNIST
2018/03/12 Python
在pycharm中显示python画的图方法
2019/08/31 Python
PyQT5 实现快捷键复制表格数据的方法示例
2020/06/19 Python
python网络爬虫实现发送短信验证码的方法
2021/02/25 Python
成教自我鉴定
2013/10/27 职场文书
白酒市场营销方案
2014/02/25 职场文书
小学学雷锋活动总结
2014/04/25 职场文书
三方股份合作协议书
2014/10/13 职场文书
2015年八一建军节活动总结
2015/03/20 职场文书
入党介绍人意见范文
2015/06/01 职场文书
初中运动会前导词
2015/07/20 职场文书