js中方法重载如何实现?以及函数的参数问题

js中没有办法直接实现方法重载,但每一个函数都有一个特殊的参数arguments,利用它可以实现方法的重载,具体示例如下
 

都知道在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传值了,相当于调用了传递了一个参数的情况。

时间: 2024-09-19 08:19:11

js中方法重载如何实现?以及函数的参数问题的相关文章

关于JS中setTimeout()无法调用带参函数问题的解决方法_javascript技巧

本文实例分析了JS中setTimeout()无法调用带参函数问题的解决方法.分享给大家供大家参考,具体如下: 解决方法:重写setTimeout() 方法,需要用到闭包函数.如下: var _st = window.setTimeout; window.setTimeout = function(fRef, mDelay){ if (typeof fRef == 'function') { var argu = Array.prototype.slice.call(arguments, 2);

js中escape对应的C#解码函数 UrlDecode_基础知识

js中escape对应的C#解码函数 System.Web.HttpUtility.UrlDecode(s) //注意编码 需要注意的几点: 1.HttpUtility.UrlEncode,HttpUtility.UrlDecode是静态方法,而Server.UrlEncode,Server.UrlDecode是实例方法. 2.Server是HttpServerUtility类的实例,是System.Web.UI.Page的属性. 3.用HttpUtility.UrlEncode编码后的字符串和

JS中setTimeout的巧妙用法前端函数节流_javascript技巧

什么是函数节流? 函数节流简单的来说就是不想让该函数在很短的时间内连续被调用,比如我们最常见的是窗口缩放的时候,经常会执行一些其他的操作函数,比如发一个ajax请求等等事情,那么这时候窗口缩放的时候,有可能连续发多个请求,这并不是我们想要的,或者是说我们常见的鼠标移入移出tab切换效果,有时候连续且移动的很快的时候,会有闪烁的效果,这时候我们就可以使用函数节流来操作.大家都知道,DOM的操作会很消耗或影响性能的,如果是说在窗口缩放的时候,为元素绑定大量的dom操作的话,会引发大量的连续计算,比如

javascript-js中的java代码如何访问js中方法的参数??见图

问题描述 js中的java代码如何访问js中方法的参数??见图 如何让1处的值传到2处这里?? 解决方案 需要用ajax提交你的index到服务器,服务器端无法直接获取客户端js的变量值 <script src=""http://ajax.aspnetcdn.com/ajax/jQuery/jquery-1.4.1.min.js""></script><script type=""text/javascript&qu

php继承中方法重载(覆盖)的应用场合_php技巧

本文实例分析了php继承中方法重载(覆盖)的应用场合.分享给大家供大家参考.具体分析如下: 方法重载(override)/覆盖--在什么情况下使用:当父类知道所有的子类都需要用到一个方法,但父类不知道怎么去写这个方法时,就需要用到方法的重载.这时候,可以让子类去重写,来覆盖这个方法. 通俗实例--父类(动物)知道其子类(猫和狗)都会叫,但它们的叫法都不一样,所以父类没法去写这个方法,只能让子类(猫和狗)去定义.代码如下: <?php class Animal{ public $name; pro

C#中方法重载详解

首先我们说一下什么是方法重载.在面对对象这样的高级语言中都允许我们在一个类中定 义多个方法名相同.方法间参数个数和参数顺序不同的方法,对于参数个数不同或者参数列 表不同的情况我们称之为参数列表不同.需要注意的是这里没有提到方法的返回值.也就是 决定方法是否构成重载有两个条件: (1)在同一个类中: (2)方法名相同: (3)参数列表不同. 例如下面的代码: public void Show()// (1) { Console.WriteLine("Nothing"); } public

Java语言入门教程(十四):Java语言中方法重载与方法覆盖

很多时候,某个Java类中有多个类似的方法.如Math类中,计算绝对值的方 法就会有多个,因为对不同数据类型的数计算方式不同.比如对float,int, long,double各类型的计算方式各不相同,那么Math类中就应该设计4个求绝对 值的方法,分别对每种类型进行计算.在这种情况下,最好的方式就是设计4个 同名,但是不同参的方法,如下所示(请参见API帮助文档): abs(double a) Returns the absolute value of a double value. abs(

JS中处理与当前时间间隔的函数代码_时间日期

复制代码 代码如下: <script type="text/javascript"> //计算一个日期字符串与当前日期相差值 //输入的参数形式如:2012-12-12 12:12:12 //返回相差值的字符串 function GetDateDiff(datetime) { // 可以将2012 - 12 - 12 12 : 12 : 12字符串转为JS中的时期对象, // 因为默认情况下只把持2000 / 05 / 05这样形式的字符串转为时间对象 var dateBe

js中格式化日期时间型数据函数代码_时间日期

例如: 现有一字符串为: var dt="2010-1-1 12:20:20"; 第一步:将其转换成日期时间型数据 复制代码 代码如下: var newDt=new Date(dt.replace("-","/")); 第二步:格式化数据成"yyyy-MM-dd" (1)扩展Date 复制代码 代码如下: Date.prototype.format = function(format){ var o = { "M+