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脚本函数库 方便开发
Oct 13 Javascript
善用事件代理,警惕闭包的性能陷阱。
Jan 20 Javascript
JavaScript打印网页指定区域的例子
May 03 Javascript
javascript学习笔记--数字格式类型
May 22 Javascript
jQuery点缩略图弹出层显示大图片
Feb 13 Javascript
javascript中eval函数用法分析
Apr 25 Javascript
自定义Angular指令与jQuery实现的Bootstrap风格数据双向绑定的单选与多选下拉框
Dec 12 Javascript
bootstrap PrintThis打印插件使用详解
Feb 20 Javascript
vue组件实现进度条效果
Jun 06 Javascript
node.js使用redis储存session的方法
Sep 26 Javascript
javascript 内存模型实例详解
Apr 18 Javascript
基于vue+element实现全局loading过程详解
Jul 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中取得image按钮传递的name值
2006/10/09 PHP
基于mysql的论坛(2)
2006/10/09 PHP
PHP引用符&amp;的用法详细解析
2013/08/22 PHP
PHP将字符分解为多个字符串的方法
2014/11/22 PHP
php实现curl模拟ftp上传的方法
2015/07/29 PHP
Thinkphp事务操作实例(推荐)
2017/04/01 PHP
PHP进阶学习之垃圾回收机制详解
2019/06/18 PHP
JavaScript CSS修改学习第三章 修改样式表
2010/02/19 Javascript
jQuery实现简单网页遮罩层/弹出层效果兼容IE6、IE7
2014/06/16 Javascript
Underscore.js 1.3.3 中文注释翻译说明
2015/06/25 Javascript
你不需要jQuery(三) 新AJAX方法fetch()
2016/06/14 Javascript
深入浅出ES6新特性之函数默认参数和箭头函数
2016/08/01 Javascript
Node.js与MySQL交互操作及其注意事项
2016/10/05 Javascript
Vue项目中ESlint规范示例代码
2019/07/04 Javascript
vue 强制组件重新渲染(重置)的两种方案
2019/10/29 Javascript
JavaScript中while循环的基础使用教程
2020/08/11 Javascript
python通过get,post方式发送http请求和接收http响应的方法
2015/05/26 Python
通过数据库向Django模型添加字段的示例
2015/07/21 Python
python3利用venv配置虚拟环境及过程中的小问题小结
2018/08/01 Python
python抓取搜狗微信公众号文章
2019/04/01 Python
python二维码操作:对QRCode和MyQR入门详解
2019/06/24 Python
Python多线程thread及模块使用实例
2020/04/28 Python
Python使用Paramiko控制liunx第三方库
2020/05/20 Python
浅谈Selenium 控制浏览器的常用方法
2020/12/04 Python
市政施工员自我鉴定
2014/01/15 职场文书
感恩节红领巾广播稿
2014/02/11 职场文书
广告设计应届生求职信
2014/03/01 职场文书
见习期自我鉴定范文
2014/03/19 职场文书
媒体宣传策划方案
2014/05/25 职场文书
理发店策划方案
2014/06/05 职场文书
2015年消防工作总结
2015/04/24 职场文书
2015年司法所工作总结
2015/04/27 职场文书
2015年小学教师培训工作总结
2015/07/21 职场文书
事业单位岗位说明书
2015/10/08 职场文书
python接口测试返回数据为字典取值方式
2022/02/12 Python
golang语言指针操作
2022/04/14 Golang