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

js中方法重载如何实现以及函数的参数问题,第1张

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

但每一个函数都有一个特殊的参数arguments,利用它可以实现方法的重载。

例如:

复制代码

代码如下:

function

Add(firstnumber,sencondnumber)

{

return

firstnumber+sencondnumber;

}

只能处理两个参数,如果有多个参数,或者没有参数,一个参数的情况都是处理不了的。如果没有传递参数,则firstnumber,sencondnumber都是未定义的,如果传递了一个参数,就相当于只给firstnumber赋值了,sencondnumber依然是未定义。相反如果传递了多于两个的参数,则相当于firstnumber,sencondnumber都赋值了,虽然还有其他的参数,但处理时都忽略掉了。如果能获取其他的参数,自然就可以处理了。此时应该就可以想到函数的特殊参数arguments,这个包含了传递给函数的所有参数,利用它就可以实现方法重载的效果。

以上的方法修改如下:

复制代码

代码如下:

function

Add(firstnumber,sencondnumber)

{

if

(argumentslength

==

0)//没有传递参数

{

return

null;

}

else

if

(argumentslength

==

1)

{//传递的是一个参数

return

firstnumber;//也可以写为

return

arguments[0];

}

else

if(argumentslength

==

2)//传递的是两个参数

{

return

firstnumber+sencondnumber;//也可以写为

return

arguments[0]+arguments[1];

}

else

{

var

total=0;

for

(var

i

=

0;

i

<

argumentslength;

i++)

{

total=total+arguments[i]

}

return

total;

}

}

当然这种方法的弊端就是参数的顺序不能打乱,如果函数实现依赖于参数的顺序,就必须进行特殊处理,例如传递null来占位。

由于传递给函数的参数是严格按照定义函数的顺序给每一个参数赋值的,如果只想给第二个参数赋值,则必须传递两个参数,否则实际上传递的值赋值给了第一个参数,并没有赋值给第二个参数。

例如只想给sencondnumber传值,但不想给firstnumber传值,必须这样调用Add(null,2)(当然函数内部必须处理传递特殊值的情况),如果这样调用Add(2),其实是给firstnumber传值了,相当于调用了传递了一个参数的情况。

这个参数是不能直接这样传递的,那你的根据启动的不同程序具体问题,具体解决,比如说你启动的是网页,你就要通过Webrequest或者WebClient类的提供的属性将参数写进网页,如果你用的word,你的利用VBA,如果是其他程序你的看它提供的接口

该包用于  动态获取包中存储过程或者函数的参数。

create or replace package SF_GET_ARGUMENTS_PKG is

  -- Author  : SANFU

  -- Created : 2020/7/22 14:40:49

  -- Purpose : 动态获取包中存储过程或者函数的参数

  PROCEDURE get_arguments(p_pkg_name in VARCHAR2, p_obj_name in VARCHAR2);

  PROCEDURE pf_get_arguments(p_pkg_name in VARCHAR2,

                            p_obj_name in VARCHAR2);

end SF_GET_ARGUMENTS_PKG;

/

create or replace package body SF_GET_ARGUMENTS_PKG is

  /============================================

  Author  : CZH

  Created  : 2020-07-22 15:00:12

  ALERTER  :

  ALERTER_TIME  :

  Purpose  :

  Arg_number  : 2

  P_PKG_NAME :包名

  P_OBJ_NAME :存储过程名或函数名

  ============================================/

  PROCEDURE get_arguments(p_pkg_name in VARCHAR2, p_obj_name in VARCHAR2) IS

    v_pkg_name  varchar2(100) := upper(p_pkg_name);

    v_obj_name  varchar2(100) := upper(p_obj_name);

    v_arg_number NUMBER;

    cursor data_cur is

      select tPACKAGE_NAME,

            tOBJECT_NAME,

            tARGUMENT_NAME,

            tIN_OUT,

            count(tARGUMENT_NAME) over(PARTITION BY tOBJECT_NAME) arg_number,

            row_number() over(partition by tOBJECT_NAME order by tPOSITION asc) rank_position

        from sysuser_arguments t

      where tPACKAGE_NAME = v_pkg_name

        and tOBJECT_NAME = v_obj_name

        and tPOSITION <> 0;

  begin

    select count(1)

      into v_arg_number

      from sysuser_arguments t

    where tPACKAGE_NAME = v_pkg_name

      and tOBJECT_NAME = v_obj_name

      and tPOSITION <> 0;

    dbms_outputput_line('/============================================');

    dbms_outputput_line(' Author  : SANFU');

    dbms_outputput_line(' Created  : ' ||

                        TO_CHAR(SYSDATE, 'YYYY-MM-DD HH24:MI:SS'));

    dbms_outputput_line(' ALERTER  : ');

    dbms_outputput_line(' ALERTER_TIME  : ');

    dbms_outputput_line(' Purpose  : ');

    dbms_outputput_line(' Obj_Name    : ' || v_obj_name);

    dbms_outputput_line(' Arg_Number  : ' || v_arg_number);

    for rec in data_cur loop

      dbms_outputput_line(' ' || recARGUMENT_NAME || ' :');

    end loop;

    dbms_outputput_line(' ============================================/');

  end get_arguments;

  --获取参数

  PROCEDURE pf_get_arguments(p_pkg_name in VARCHAR2,

                            p_obj_name in VARCHAR2) IS

    v_pkg_name varchar2(100) := upper(p_pkg_name);

    v_obj_name varchar2(100) := upper(p_obj_name);

    v_attr    varchar2(100);

    cursor data_cur is

      select tPACKAGE_NAME,

            tOBJECT_NAME,

            tARGUMENT_NAME,

            tIN_OUT,

            count(tARGUMENT_NAME) over(PARTITION BY tOBJECT_NAME) arg_number,

            row_number() over(partition by tOBJECT_NAME order by tPOSITION asc) rank_position

        from sysuser_arguments t

      where tPACKAGE_NAME = v_pkg_name

        and tOBJECT_NAME = v_obj_name

        and tPOSITION <> 0;

  begin

    dbms_outputput_line(v_pkg_name || '' || v_obj_name || '(');

    for rec in data_cur loop

      if recin_out = 'IN' then

        v_attr := '';

      elsif recin_out = 'OUT' then

        v_attr := '';

      elsif recin_out = 'IN/OUT' then

        v_attr := '';

      end if;

      if data_cur%ROWCOUNT = recarg_number then

        dbms_outputput_line(lower(recARGUMENT_NAME) || '        =>' ||

                            '  ' || v_attr || lower(recARGUMENT_NAME));

      else

        dbms_outputput_line(lower(recARGUMENT_NAME) || '        =>' ||

                            '  ' || v_attr || lower(recARGUMENT_NAME) || ',');

      end if;

    end loop;

    dbms_outputput_line(');');

  end pf_get_arguments;

end SF_GET_ARGUMENTS_PKG;

/

以上就是关于js中方法重载如何实现以及函数的参数问题全部的内容,包括:js中方法重载如何实现以及函数的参数问题、C# 一个程序启动另一个程序,ProcessStartInfo.Arguments接收参数、ORACLE 获取包中存储过程或函数的参数等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/9710925.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-01
下一篇 2023-05-01

发表评论

登录后才能评论

评论列表(0条)

保存