为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聚焦文本框与扩展文本框聚焦方法
Oct 12 Javascript
tangram框架响应式加载图片方法
Nov 21 Javascript
利用js(jquery)操作Cookie的方法说明
Dec 19 Javascript
调用DOM对象的focus使文本框获得焦点
Feb 19 Javascript
jQuery获取上传文件的名称的正则表达式
May 21 Javascript
百度地图API之本地搜索与范围搜索
Jul 30 Javascript
JS实现超精简响应鼠标显示二级菜单代码
Sep 12 Javascript
JS实现隐藏同级元素后只显示JS文件内容的方法
Sep 04 Javascript
JavaWeb表单及时验证功能在输入后立即验证(含用户类型,性别,爱好...的验证)
Jun 09 Javascript
Angular实现的简单定时器功能示例
Dec 28 Javascript
如何基于vue-cli3.0构建功能完善的移动端架子
Apr 24 Javascript
jQuery zTree插件快速实现目录树
Aug 16 jQuery
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 PHP5和Apache的安装与配置
2009/06/08 PHP
php冒泡排序、快速排序、快速查找、二维数组去重实例分享
2014/04/24 PHP
PHP实现的连贯操作、链式操作实例
2014/07/08 PHP
Nginx+php配置文件及原理解析
2020/12/09 PHP
JavaScript 动态改变图片大小
2009/06/11 Javascript
JavaScript this 深入理解
2009/07/30 Javascript
javascript处理table表格的代码
2010/12/06 Javascript
解析JavaScript中的不可见数据类型
2013/12/02 Javascript
css3元素简单的闪烁效果实现(html5 jquery)
2013/12/28 Javascript
JavaScript实现将xml转换成html table表格的方法
2015/04/17 Javascript
IE7浏览器窗口大小改变事件执行多次bug及IE6/IE7/IE8下resize问题
2015/08/21 Javascript
多个js毫秒倒计时同时进行效果
2016/01/05 Javascript
angular实现form验证实例代码
2017/01/17 Javascript
js实现功能比较全面的全选和多选
2017/03/02 Javascript
微信小程序实战之上拉(分页加载)效果(2)
2017/04/17 Javascript
原生JavaScript实现精美的淘宝轮播图效果示例【附demo源码下载】
2017/05/27 Javascript
Vue.js中数据绑定的语法教程
2017/06/02 Javascript
ES6扩展运算符用法实例分析
2017/10/31 Javascript
JavaScript引用类型RegExp基本用法详解
2018/08/09 Javascript
利用Vue构造器创建Form组件的通用解决方法
2018/12/03 Javascript
vue中keep-alive,include的缓存问题
2019/11/26 Javascript
vue路由权限校验功能的实现代码
2020/06/07 Javascript
JS+CSS实现过渡特效
2021/01/02 Javascript
python和shell变量互相传递的几种方法
2013/11/20 Python
python实现将pvr格式转换成pvr.ccz的方法
2015/04/28 Python
Python 2与Python 3版本和编码的对比
2017/02/14 Python
JSON Web Tokens的实现原理
2017/04/02 Python
django.db.utils.ProgrammingError: (1146, u“Table‘’ doesn’t exist”)问题的解决
2018/07/13 Python
python使用梯度下降和牛顿法寻找Rosenbrock函数最小值实例
2020/04/02 Python
中国酒类在线零售网站:酒仙网
2016/08/20 全球购物
类如何去实现接口
2013/12/19 面试题
EJB包括(SessionBean,EntityBean)说出他们的生命周期,及如何管理事务的
2015/07/24 面试题
部队领导证婚词
2014/01/12 职场文书
行政监察建议书
2014/05/19 职场文书
民族学专业职业生涯规划范文:积跬步以至千里
2014/09/11 职场文书
2014年十一国庆节活动方案
2014/09/16 职场文书