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刷新框架子页面的七种方法代码
Nov 20 Javascript
jquery 弹出层注册页面等(asp.net后台)
Jun 17 Javascript
JQuery插件开发示例代码
Nov 06 Javascript
JS和jQuery使用submit方法无法提交表单的原因分析及解决办法
May 17 Javascript
深入理解jQuery()方法的构建原理
Dec 05 Javascript
微信小程序封装http访问网络库实例代码
May 24 Javascript
Vue仿手机qq的实例代码(demo)
Sep 08 Javascript
微信小程序上传图片功能(附后端代码)
Jun 19 Javascript
原生JS实现DOM加载完成马上执行JS代码的方法
Sep 07 Javascript
Element 默认勾选表格 toggleRowSelection的实现
Sep 04 Javascript
Jquery Datatables的使用详解
Jan 30 jQuery
原生js中运算符及流程控制示例详解
Jan 05 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不用正则采集速度探究总结
2008/03/24 PHP
php in_array 函数使用说明与in_array需要注意的地方说明
2010/04/13 PHP
PHP数组排序函数合集 以及它们之间的联系分析
2013/06/27 PHP
PHP管理依赖(dependency)关系工具 Composer的自动加载(autoload)
2014/08/18 PHP
php开发微信支付获取用户地址
2015/10/04 PHP
PHP实现的方程求解示例分析
2016/11/11 PHP
动态样式类封装JS代码
2009/09/02 Javascript
JQuery DataTable删除行后的页面更新利用Ajax解决
2013/05/17 Javascript
javascript中的括号()用法小结
2014/04/14 Javascript
详解JavaScript语法对{}处理的坑爹之处
2014/06/05 Javascript
原生JavaScript实现滚动条效果
2020/03/24 Javascript
javascript html5摇一摇功能的实现
2016/04/19 Javascript
微信小程序(三):网络请求
2017/01/13 Javascript
jquery uploadify隐藏上传进度的实现方法
2017/02/06 Javascript
ReactNative之键盘Keyboard的弹出与消失示例
2017/07/11 Javascript
Vue封装Swiper实现图片轮播效果
2018/02/06 Javascript
如何在Angular应用中创建包含组件方法示例
2019/03/23 Javascript
浅谈VUE防抖与节流的最佳解决方案(函数式组件)
2019/05/22 Javascript
Python实现动态加载模块、类、函数的方法分析
2017/07/18 Python
使用python中的in ,not in来检查元素是不是在列表中的方法
2018/07/06 Python
Python Scapy随心所欲研究TCP协议栈
2018/11/20 Python
如何使用Python进行OCR识别图片中的文字
2019/04/01 Python
Pytorch Tensor的统计属性实例讲解
2019/12/30 Python
基于python检查矩阵计算结果
2020/05/21 Python
详解Anaconda安装tensorflow报错问题解决方法
2020/11/01 Python
Python排序函数的使用方法详解
2020/12/11 Python
css3实现画半圆弧线的示例代码
2017/11/06 HTML / CSS
戴尔加拿大官网:Dell加拿大
2016/09/17 全球购物
印度排名第一的蛋糕、鲜花和礼品送货:Winni
2019/08/02 全球购物
瑞士首家网上药店折扣店:McDrogerie
2020/12/22 全球购物
历史系毕业生自荐信
2013/10/28 职场文书
教师旷工检讨书
2014/01/18 职场文书
入职担保书范文
2014/05/21 职场文书
消防志愿者活动方案
2014/08/23 职场文书
收款授权委托书
2014/10/02 职场文书
五年级学生期末评语
2014/12/26 职场文书