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 相关文章推荐
js 获取中文拼音,Select自动匹配字母获取值的代码
Sep 23 Javascript
jquery批量控制form禁用的代码
Aug 06 Javascript
document.getElementById获取控件对象为空的解决方法
Nov 20 Javascript
jQuery基于当前元素进行下一步的遍历
May 20 Javascript
javascript实现仿腾讯游戏选择
May 14 Javascript
把Node.js程序加入服务实现随机启动
Jun 25 Javascript
Bootstrap Paginator分页插件使用方法详解
May 30 Javascript
JavaScript提高加载和执行效率的方法
Feb 03 Javascript
Angularjs 依赖压缩及自定义过滤器写法
Feb 04 Javascript
vue货币过滤器的实现方法
Apr 01 Javascript
二维码图片生成器QRCode.js简单介绍
Aug 18 Javascript
vue + element-ui的分页问题实现
Dec 17 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
JS 网站性能优化笔记
2011/05/24 PHP
PHP中的Session对象如何使用
2015/09/25 PHP
php删除数组中重复元素的方法
2015/12/22 PHP
Laravel实现自定义错误输出内容的方法
2016/10/10 PHP
基于php中echo用逗号和用点号的区别详解
2018/01/23 PHP
PHP反射实际应用示例
2019/04/03 PHP
PHP标准库 (SPL)――Countable用法示例
2020/06/05 PHP
动手学习无线电
2021/03/10 无线电
formValidator3.3的ajaxValidator一些异常分析
2011/07/12 Javascript
jQuery使用之设置元素样式用法实例
2015/01/19 Javascript
jQuery实现仿腾讯迷你首页选项卡效果代码
2015/09/17 Javascript
JavaScript实现的背景自动变色代码
2015/10/17 Javascript
node.js+express制作网页计算器
2016/01/17 Javascript
JavaScript绑定事件监听函数的通用方法
2016/05/14 Javascript
巧用Javascript的逻辑运算符
2016/12/02 Javascript
在node中如何使用 ES6
2017/04/22 Javascript
JavaScript基本语法_动力节点Java学院整理
2017/06/26 Javascript
基于vue2实现左滑删除功能
2017/11/28 Javascript
vue中el-upload上传图片到七牛的示例代码
2018/10/19 Javascript
详解bootstrap-fileinput文件上传控件的亲身实践
2019/03/21 Javascript
javascript关于“时间”的一次探索
2019/07/24 Javascript
[02:57]DOTA2亚洲邀请赛小组赛第四日 赛事回顾
2015/02/02 DOTA
Python实现的一个找零钱的小程序代码分享
2014/08/25 Python
通过Python来使用七牛云存储的方法详解
2015/08/07 Python
为Python的Tornado框架配置使用Jinja2模板引擎的方法
2016/06/30 Python
linux环境下python中MySQLdb模块的安装方法
2017/06/16 Python
Python的argparse库使用详解
2018/10/09 Python
python分批定量读取文件内容,输出到不同文件中的方法
2018/12/08 Python
​如何愉快地迁移到 Python 3
2019/04/28 Python
python+selenium select下拉选择框定位处理方法
2019/08/24 Python
中西医结合临床医学专业大学生自荐信
2013/09/28 职场文书
计算机求职信
2014/07/02 职场文书
红色旅游心得体会
2014/09/03 职场文书
2014年小学体育工作总结
2014/12/11 职场文书
Jupyter notebook 输出部分显示不全的解决方案
2021/04/24 Python
Mysql数据库表中为什么有索引却没有提高查询速度
2022/02/24 MySQL