为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 相关文章推荐
Javascript 事件流和事件绑定
Jul 16 Javascript
JAVASCRIPT style 中visibility和display之间的区别
Jan 22 Javascript
开发 Internet Explorer 右键功能表(ContextMenu)
Jul 03 Javascript
js的2种继承方式详解
Mar 04 Javascript
js识别不同浏览器基于userAgent做判断
Jul 29 Javascript
javascript实现Email邮件显示与删除功能
Nov 21 Javascript
JavaScript+canvas实现七色板效果实例
Feb 18 Javascript
ES6学习教程之Map的常用方法总结
Aug 03 Javascript
打字效果动画的4种实现方法(超简单)
Oct 18 Javascript
vue弹窗组件的实现示例代码
Sep 10 Javascript
详解React服务端渲染从入门到精通
Mar 28 Javascript
使用webpack和rollup打包组件库的方法
Feb 25 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中取得URL的根域名的代码
2011/03/23 PHP
php 数组使用详解 推荐
2011/06/02 PHP
destoon各类调用汇总
2014/06/20 PHP
php实现登录页面的简单实例
2019/09/29 PHP
在页面上点击任一链接时触发一个事件的代码
2007/04/07 Javascript
jQuery Ajax之$.get()方法和$.post()方法
2009/10/12 Javascript
网络图片延迟加载实现代码 超越jquery控件
2010/03/27 Javascript
使用GruntJS构建Web程序之安装篇
2014/06/04 Javascript
javascript中一些util方法汇总
2015/06/10 Javascript
js点击列表文字对应该行显示背景颜色的实现代码
2015/08/05 Javascript
Jquery为DIV添加click事件的简单实例
2016/06/02 Javascript
node.js express安装及示例网站搭建方法(分享)
2016/08/22 Javascript
jQuery特殊符号转义的实现
2016/11/30 Javascript
js数组实现权重概率分配
2017/09/12 Javascript
vue2组件之select2调用的示例代码
2017/10/12 Javascript
Angular移动端页面input无法输入的解决方法
2017/11/14 Javascript
利用JS动态生成隔行换色HTML表格的两种方法
2018/10/09 Javascript
关于引入vue.js 文件的知识点总结
2020/01/28 Javascript
JS中锚点链接点击平滑滚动并自由调整到顶部位置
2021/02/06 Javascript
[05:00]TI9战队采访 - Royal Never Give Up
2019/08/20 DOTA
python 合并文件的具体实例
2013/08/08 Python
用Python设计一个经典小游戏
2017/05/15 Python
Python时间的精准正则匹配方法分析
2017/08/17 Python
Python中pygal绘制雷达图代码分享
2017/12/07 Python
查看django版本的方法分享
2018/05/14 Python
详解python 降级到3.6终极解决方案
2020/02/06 Python
python根据用户需求输入想爬取的内容及页数爬取图片方法详解
2020/08/03 Python
python 两种方法修改文件的创建时间、修改时间、访问时间
2020/09/26 Python
CSS3的 fit-content实现水平居中
2017/09/07 HTML / CSS
意大利大型购物中心:Oliviero.it
2017/10/19 全球购物
澳洲Chemist Direct药房中文网:澳洲大型线上直邮药房
2019/11/04 全球购物
代办委托书怎么写
2014/08/01 职场文书
公共场所禁烟倡议书
2014/08/30 职场文书
反四风对照检查材料
2014/09/22 职场文书
关于上班时间调整的通知
2015/04/23 职场文书
医院合作意向书范本
2015/05/08 职场文书