js中方法重载如何实现?以及函数的参数问题


Posted in Javascript onAugust 01, 2013

都知道在js中没有办法直接实现方法重载,因为在js中如果定义了多个名称相同,但参数个数不一样的方法,其实只有最后一个方法能被真正调用,其他的方法都被覆盖掉了。

但每一个函数都有一个特殊的参数arguments,利用它可以实现方法的重载。

例如:

function Add(firstnumber,sencondnumber) { 
return firstnumber+sencondnumber; 
}

只能处理两个参数,如果有多个参数,或者没有参数,一个参数的情况都是处理不了的。如果没有传递参数,则firstnumber,sencondnumber都是未定义的,如果传递了一个参数,就相当于只给firstnumber赋值了,sencondnumber依然是未定义。相反如果传递了多于两个的参数,则相当于firstnumber,sencondnumber都赋值了,虽然还有其他的参数,但处理时都忽略掉了。如果能获取其他的参数,自然就可以处理了。此时应该就可以想到函数的特殊参数arguments,这个包含了传递给函数的所有参数,利用它就可以实现方法重载的效果。

以上的方法修改如下:

function Add(firstnumber,sencondnumber) { 
if (arguments.length == 0)//没有传递参数 
{ 
return null; 
} 
else if (arguments.length == 1) {//传递的是一个参数 
return firstnumber;//也可以写为 return arguments[0]; 
} 
else if(arguments.length == 2)//传递的是两个参数 
{ return firstnumber+sencondnumber;//也可以写为 return arguments[0]+arguments[1]; 
} 
else { 
var total=0; 
for (var i = 0; i < arguments.length; i++) { 
total=total+arguments[i] 
} 
return total; 
} 
}

当然这种方法的弊端就是参数的顺序不能打乱,如果函数实现依赖于参数的顺序,就必须进行特殊处理,例如传递null来占位。

由于传递给函数的参数是严格按照定义函数的顺序给每一个参数赋值的,如果只想给第二个参数赋值,则必须传递两个参数,否则实际上传递的值赋值给了第一个参数,并没有赋值给第二个参数。

例如只想给sencondnumber传值,但不想给firstnumber传值,必须这样调用Add(null,2)(当然函数内部必须处理传递特殊值的情况),如果这样调用Add(2),其实是给firstnumber传值了,相当于调用了传递了一个参数的情况。

Javascript 相关文章推荐
Javascript代码混淆综合解决方案-Javascript在线混淆器
Dec 18 Javascript
js获取光标位置和设置文本框光标位置示例代码
Jan 09 Javascript
js实现简单鼠标跟随效果的方法
Apr 10 Javascript
利用Jquery实现几款漂亮实用的时间轴(附示例代码)
Feb 15 Javascript
javascript获取以及设置光标位置
Feb 16 Javascript
jQuery自定义元素右键点击事件(实现案例)
Apr 28 jQuery
JavaScript之创意时钟项目(实例讲解)
Oct 23 Javascript
angularJs-$http实现百度搜索时的动态下拉框示例
Feb 27 Javascript
js 数组详细操作方法及解析合集
Jun 01 Javascript
js中位运算的运用实例分析
Dec 11 Javascript
JS原形与原型链深入详解
May 09 Javascript
Vue实现简单的跑马灯
May 25 Javascript
子窗体与父窗体传值示例js代码
Aug 01 #Javascript
根据选择不同的下拉值出现相对应的文本输入框
Aug 01 #Javascript
jquery图片放大功能简单实现
Aug 01 #Javascript
基于jquery的文章中所有图片width大小批量设置方法
Aug 01 #Javascript
Jquery动态更改一张位图的src与Attr的使用
Jul 31 #Javascript
jquery中选择块并改变属性值的方法
Jul 31 #Javascript
JQuery写动态树示例代码
Jul 31 #Javascript
You might like
PHP 创建标签云函数代码
2010/05/26 PHP
PHP计划任务、定时执行任务的实现代码
2011/04/23 PHP
PHP投票系统防刷票判断流程分析
2012/02/04 PHP
php遍历文件夹和文件列表示例分享
2014/03/11 PHP
PHP结合jQuery插件ajaxFileUpload实现异步上传文件实例
2020/08/17 PHP
Yii2.0 模态弹出框+ajax提交表单
2016/05/22 PHP
静态页面的值传递(三部曲)
2006/09/25 Javascript
JQuery 学习笔记01 JQuery初接触
2010/05/06 Javascript
跨浏览器开发经验总结(四) 怎么写入剪贴板
2010/05/13 Javascript
js正文内容高亮效果的实现方法
2013/06/30 Javascript
Jquery实现鼠标移动放大图片功能实例
2015/03/25 Javascript
微信小程序学习之数据处理详解
2017/07/05 Javascript
微信小程序实现action-sheet弹出底部菜单功能【附源码下载】
2017/12/09 Javascript
详解VUE2.X过滤器的使用方法
2018/01/11 Javascript
详解keep-alive + vuex 让缓存的页面灵活起来
2019/04/19 Javascript
vue实现侧边栏导航效果
2019/10/21 Javascript
jquery实现直播弹幕效果
2019/11/28 jQuery
[01:33:14]LGD vs VP Supermajor 败者组决赛 BO3 第二场 6.10
2018/07/04 DOTA
Python实现的ini文件操作类分享
2014/11/20 Python
python实现颜色rgb和hex相互转换的函数
2015/03/19 Python
简单了解Python下用于监视文件系统的pyinotify包
2015/11/13 Python
Python实现二分查找与bisect模块详解
2017/01/13 Python
Python 实现使用dict 创建二维数据、DataFrame
2018/04/13 Python
Python实现删除排序数组中重复项的两种方法示例
2019/01/31 Python
Django使用Jinja2模板引擎的示例代码
2019/08/09 Python
Python类中的魔法方法之 __slots__原理解析
2019/08/26 Python
Python常用数据类型之间的转换总结
2019/09/06 Python
python matplotlib.pyplot.plot()参数用法
2020/04/14 Python
Python为何不支持switch语句原理详解
2020/10/21 Python
python 基于selectors库实现文件上传与下载
2020/12/31 Python
HTML5本地存储之Web Storage应用介绍
2013/01/06 HTML / CSS
毕业生找工作的求职信范文
2013/12/24 职场文书
新入职员工的自我介绍演讲稿
2014/01/02 职场文书
2014年业务员工作总结范文
2014/11/17 职场文书
化验室岗位职责
2015/02/14 职场文书
领导干部学习心得体会
2016/01/23 职场文书