`
923723914
  • 浏览: 635078 次
文章分类
社区版块
存档分类
最新评论

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

 
阅读更多

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


分享到:
评论

相关推荐

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

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

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

    都知道在js中没有办法直接实现方法重载,因为在js中如果定义了多个名称相同,但参数个数不一样的方法,其实只有最后一个方法能被真正调用,其他的方法都被覆盖掉了。 但每一个函数都有一个特殊的参数arguments,利用...

    js面向对象编程之如何实现方法重载

    都知道在js中如果存在多个名称相同的函数,则调用实际每次都只使用最后一个,js其实是没有重载的,也就是说,如果定义了多个同名的函数,单参数不一样,在调用时,js不管参数个数,只管前后顺序 例如: function ...

    如何实现JS函数的重载

    javascript不能支持函数的重载,如下: 代码如下:[removed] function f(length) { alert&#40;... 在函数中可以用f.arguments[0]和f.arguments[1]得到调用时传入的第一和第二个参数,所以定义function(lengt

    TypeScript中的方法重载详解

    虽然语言层面无法自动进行重载,但借助其动态的特性,我们可以在代码中手动检查入参的类型,或者通过 arguments 获取到参数个数,从而实现根据不同的入参做不同的操作。 比如有一个获取聊天消息的方法,根据传入的...

    妙用缓存调用链实现JS方法的重载

    首先javascript是没有重载函数/方法这个概念的,但是js提供了一个arguments这个方法参数,通过这个参数的length属性就可以拿到方法参数的长度,o~对了,咱们今天实现的也仅仅是按照参数长度重载,而不是参数类型~~·...

    Javascript基础 函数“重载” 详细介绍

    所以Javascript是不能像其他语言一样实现方法名相同,参数个数不同…的这类重载的,不信你可以试试: 代码如下: function show(){ alert&#40;“1”&#41;; } function show(num1){ alert&#40;num1&#41;; } ...

    JS函数重载的解决方案

    在面向对象的编程中,很多语言都支持函数重载,能根据函数传递的不同个数、类型的参数来做不同的操作,JS对它却不支持,需要我们额外做些小动作。

    ES6中Proxy与Reflect实现重载(overload)的方法

    本文实例讲述了ES6中Proxy与Reflect实现重载(overload)的方法。分享给大家供大家参考,具体如下: Proxy与Reflect实现重载(overload) 从语法角度讲JavaScript不支持重载。原因很简单,JS中函数可以传入任意类型、...

    js 覆盖和重载 函数

    重载指两个或多个函数的参数类型,顺序和数量以及返回值不一样。 覆盖指两个或多个函数的参数类型,顺序和数量以及返回值完全一样。 那javascript真的有这种特性么? 回答是JS中函数重名只会采用最后一个定义。 ...

    让JavaScript 轻松支持函数重载 (Part 1 – 设计)

    说支持,是因为JavaScript函数对参数列表不作任何限制,可以在函数内部模拟对函数重载的支持。 实际上,在很多著名的开源库当中,我们都可以看到函数内部模拟重载支持的设计。例如说jQuery的jQuery.extend方法,就是...

    javascript中通过arguments参数伪装方法重载

    在很多面向对象的高级语言中,都有方法的重载。而javascript没有方法重载这个概念。但是我们可以通过arguments这个参数来伪装成函数的重载 在模拟之前我们先看一下代码: 代码如下: //表面上没有声明形式参数的函数...

    javascript函数重载解决方案分享

    JS的函数定义可以指定形式参数名称,多多少少我们会以为js至少可以支持参数个数不同的方法重载,然而遗憾的是这仅仅是一个假象,js所有的参数都是以arguments传递过去的,这个参数类似于数组,在函数调用的时候,...

    JavaScript重载函数实例剖析

    1.javascript 中是没有重载函数这个概念的! 首先javascript是没有重载函数这个概念的,很久以前,我用javascript做网页的时候,写一些简单的效果,根本不需要用到重载函数,当写游戏的时候,有大量的函数的时候,就...

    PHP实现的函数重载功能示例

    因此基于这2点,注定了PHP中无法重载函数,(类似Javascript语言),也无法有构造函数的重载。 由于实现函数的重载对提高开发效率很有帮助,如果能象C#或者C++那样,那就非常好了。事实上,PHP的提供了一个魔术方法...

    leFunc:Javascript 函数重载器

    用 leFunc 重载你的函数 它基本上提供了一种结构化的方式来检查你的函数。 在构建可以具有多种参数组合的 api 时,它特别有用。 var getItems = leFunc ( { "string" : function ( id ) { // Do something } , ...

    JavaScript 通过模式匹配实现重载

    正好infinte同学提出“更优雅的兼容”其实也和这个问题有一定的关联(我们后面会看到) 在youa的脚本库中Function的Helper中,添加支持重载的模式匹配 代码如下: /** * 函数参数重载方法 overload,对函数参数进行...

Global site tag (gtag.js) - Google Analytics