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 相关文章推荐
用jquery统计子菜单的条数示例代码
Oct 18 Javascript
js日期对象兼容性的处理方法
Jan 28 Javascript
js的hasownproperty使用示例
Mar 02 Javascript
查找页面中所有类为test的结点的方法
Mar 28 Javascript
javascript获取重复次数最多的字符
Jul 08 Javascript
JS实现滑动门效果的方法详解
Dec 19 Javascript
vue2.0 computed 计算list循环后累加值的实例
Mar 07 Javascript
Vue.js的复用组件开发流程完整记录
Nov 29 Javascript
JS原型与继承操作示例
May 09 Javascript
js实现无限瀑布流实例方法
Sep 16 Javascript
JS合并两个数组的3种方法详解
Oct 24 Javascript
vue实现短信验证码登录功能(流程详解)
Dec 10 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+MySQL5.0中文乱码解决方法
2006/11/20 PHP
web站点获取用户IP的安全方法 HTTP_X_FORWARDED_FOR检验
2013/06/01 PHP
php中多维数组按指定value排序的实现代码
2014/08/19 PHP
详解PHP中array_rand函数的使用方法
2016/09/11 PHP
PHP如何获取当前主机、域名、网址、路径、端口等参数
2017/06/09 PHP
php 可变函数使用小结
2018/06/12 PHP
Laravel 验证码认证学习记录小结
2019/12/20 PHP
javascript 简单高效判断数据类型 系列函数 By shawl.qiu
2007/03/06 Javascript
javascript Array.remove() 数组删除
2009/08/06 Javascript
JavaScript Tips 使用DocumentFragment加快DOM渲染速度
2010/06/28 Javascript
8个超棒的学习 jQuery 的网站 推荐收藏
2011/04/02 Javascript
求数组最大最小值方法适用于任何数组
2013/08/16 Javascript
js获取Html元素的实际宽度高度的方法
2016/05/19 Javascript
Angularjs CURD 详解及实例代码
2016/09/14 Javascript
微信小程序 跳转方式总结
2017/04/20 Javascript
Vue引入jquery实现平滑滚动到指定位置
2018/05/09 jQuery
Vue监听一个数组id是否与另一个数组id相同的方法
2018/09/26 Javascript
微信小程序时间控件picker view使用详解
2018/12/28 Javascript
vue移动端弹起蒙层滑动禁止底部滑动操作
2020/07/22 Javascript
vue打开新窗口并实现传参的图文实例
2021/03/04 Vue.js
跟老齐学Python之画圈还不简单吗?
2014/09/20 Python
快速了解Python中的装饰器
2018/01/11 Python
Python编程实现从字典中提取子集的方法分析
2018/02/09 Python
python如何创建TCP服务端和客户端
2018/08/26 Python
Python爬取微信小程序Charles实现过程图解
2020/09/29 Python
美国最古老的精致书写工具制造商:A.T. Cross(高仕)
2018/01/30 全球购物
威盛公司软件C++工程师笔试题面试题
2012/07/16 面试题
连锁经营管理专业大学生求职信
2013/10/30 职场文书
学期自我鉴定
2013/11/04 职场文书
会计专业应届生求职信
2013/11/24 职场文书
国家助学金获奖感言
2014/01/31 职场文书
七年级政治教学反思
2014/02/03 职场文书
财务部会计岗位职责
2015/02/03 职场文书
事业单位个人总结
2015/02/12 职场文书
公务员廉洁从政心得体会
2016/01/19 职场文书
物业管理交接协议书
2016/03/24 职场文书