为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 相关文章推荐
Prototype Class对象学习
Jul 19 Javascript
JSON 和 JavaScript eval使用说明
Jun 13 Javascript
js和jquery批量绑定事件传参数一(新猪猪原创)
Jun 23 Javascript
jQuery Trim去除字符串首尾空字符的实现方法说明
Feb 11 Javascript
将中国标准时间转换成标准格式的代码
Mar 20 Javascript
javascript实现网页背景烟花效果的方法
Aug 06 Javascript
基于js实现微信发送好友如何分享到朋友圈、微博
Nov 30 Javascript
Javascript之面向对象--封装
Dec 02 Javascript
浅谈Node.js:fs文件系统模块
Dec 08 Javascript
微信小程序实现顶部导航特效
Jan 28 Javascript
关于Vue Router的10条高级技巧总结
May 06 Vue.js
Ajax请求超时与网络异常处理图文详解
May 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
在PHP上显示JFreechart画的统计图方法
2013/11/03 PHP
PHP框架自动加载类文件原理详解
2017/06/06 PHP
php实现支付宝当面付(扫码支付)功能
2018/05/30 PHP
页面中iframe相互传值传参
2009/12/13 Javascript
基于jquery的横向滚动条(滑动条)
2011/02/24 Javascript
Javascript 按位与赋值运算符 (&amp;=)使用介绍
2014/02/04 Javascript
JQuery与JS里submit()的区别示例介绍
2014/02/17 Javascript
angular.foreach 循环方法使用指南
2015/01/06 Javascript
jQuery实现设置、移除文本框默认值功能
2015/01/13 Javascript
Javascript闭包用法实例分析
2015/01/23 Javascript
JS实现点击颜色块切换指定区域背景颜色的方法
2015/02/25 Javascript
使用JavaScript刷新网页的方法
2015/06/04 Javascript
JS针对Array的各种操作汇总
2016/11/29 Javascript
JS实现的合并多个数组去重算法示例
2018/04/11 Javascript
js动态设置select下拉菜单的默认选中项实例
2018/08/21 Javascript
一步一步实现Vue的响应式(对象观测)
2019/09/02 Javascript
vue+element搭建后台小总结 el-dropdown下拉功能
2020/04/10 Javascript
使用npm命令提示: 'npm' 不是内部或外部命令,也不是可运行的程序的处理方法
2020/05/14 Javascript
Unicode和Python的中文处理
2017/03/19 Python
python snownlp情感分析简易demo(分享)
2017/06/04 Python
Python 数据库操作 SQLAlchemy的示例代码
2019/02/18 Python
Django继承自带user表并重写的例子
2019/11/18 Python
python实现定时发送邮件到指定邮箱
2020/12/23 Python
纯CSS3实现手风琴风格菜单具体步骤
2013/05/06 HTML / CSS
雅诗兰黛加拿大官网:Estee Lauder加拿大
2019/07/31 全球购物
如何用Lucene索引数据库
2016/02/23 面试题
大学毕业生简单自荐信
2013/11/05 职场文书
旅游市场营销方案
2014/03/09 职场文书
我爱我家教学反思
2014/05/01 职场文书
班组长安全工作职责
2014/07/15 职场文书
2014优秀大学生简历自我评价
2014/09/15 职场文书
2014年军人思想汇报范文
2014/10/12 职场文书
质量承诺书格式范文
2015/04/28 职场文书
Python干货实战之八音符酱小游戏全过程详解
2021/10/24 Python
Pandas实现DataFrame的简单运算、统计与排序
2022/03/31 Python
Android开发手册TextInputLayout样式使用示例
2022/06/10 Java/Android