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 相关文章推荐
FormValid0.5版本发布,带ajax自定义验证例子
Aug 17 Javascript
JavaScript与Image加载事件(onload)、加载状态(complete)
Feb 14 Javascript
JavaScript中去掉数组中的重复值的实现方法
Aug 03 Javascript
JavaScript定义类和对象的方法
Nov 26 Javascript
javascript基础知识分享之类与函数化
Feb 13 Javascript
jQuery实现的多滑动门,多选项卡效果代码
Mar 28 Javascript
Angular中$cacheFactory的作用和用法实例详解
Aug 19 Javascript
jQuery实现磁力图片跟随效果完整示例
Sep 16 Javascript
vue.extend实现alert模态框弹窗组件
Apr 28 Javascript
express.js中间件说明详解
Mar 19 Javascript
JavaScript代理模式原理与用法实例详解
Mar 10 Javascript
vue+Element-ui前端实现分页效果
Nov 15 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
如何开发一个虚拟域名系统
2006/10/09 PHP
PHP小教程之实现链表
2014/06/09 PHP
PHP创建对象的六种方式实例总结
2019/06/27 PHP
传智播客学习之JavaScript基础篇
2009/11/13 Javascript
js 复制或插入Html的实现方法小结
2010/05/19 Javascript
有关JavaScript的10个怪癖和秘密分享
2011/08/28 Javascript
代码触发js事件(click、change)示例应用
2013/12/13 Javascript
Area 区域实现post提交数据的js写法
2014/04/22 Javascript
jQuery动态效果显示人物结构关系图的方法
2015/05/07 Javascript
jQuery+HTML5实现图片上传前预览效果
2015/08/20 Javascript
详解AngularJS Filter(过滤器)用法
2015/12/28 Javascript
jQuery简单实现提交数据出现loading进度条的方法
2016/03/29 Javascript
jquery插件Jplayer使用方法简析
2016/04/22 Javascript
JavaScript如何实现跨域请求
2016/08/05 Javascript
js HTML5多媒体影音播放
2016/10/17 Javascript
快速搭建React的环境步骤详解
2017/11/06 Javascript
JavaScript中import用法总结
2019/01/20 Javascript
Vuex模块化应用实践示例
2020/02/03 Javascript
解密Python中的描述符(descriptor)
2015/06/03 Python
mysql 之通过配置文件链接数据库
2017/08/12 Python
Python 比较两个数组的元素的异同方法
2017/08/17 Python
在mac下查找python包存放路径site-packages的实现方法
2018/11/06 Python
python基于Selenium的web自动化框架
2019/07/14 Python
解决python 执行sql语句时所传参数含有单引号的问题
2020/06/06 Python
突袭HTML5之Javascript API扩展4—拖拽(Drag/Drop)概述
2013/01/31 HTML / CSS
使用HTML5技术开发一个属于自己的超酷颜色选择器
2013/09/22 HTML / CSS
HTML5实现多张图片上传功能
2016/03/11 HTML / CSS
日本卡普空电视游戏软件公司官方购物网站:e-CAPCOM
2018/07/17 全球购物
Europcar澳大利亚官网:全球汽车租赁领域的领导者
2019/03/24 全球购物
2014年党员承诺书范文
2014/05/20 职场文书
毕业生应聘求职信
2014/07/10 职场文书
大学军训的体会
2014/11/08 职场文书
倡议书作文
2015/01/19 职场文书
车位出租协议书范本
2016/03/19 职场文书
Python使用random模块实现掷骰子游戏的示例代码
2021/04/29 Python
关于Redis的主从复制及哨兵问题
2022/06/16 Redis