都知道在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 获取包中存储过程或函数的参数等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)