`
superfofo
  • 浏览: 128761 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

如何实现JS函数的重载

    博客分类:
  • HTML
阅读更多
在网上看了一些js的重载文章,发现这篇解释得比较通俗易懂:
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

javascript不能支持函数的重载,如下:
<script language="JavaScript"> 
function f(length) 
{ 
alert("高为:"+length); 
} 
function f(length,width) 
{ 
alert("高为:"+length+",宽为:"+width); 
} 
</srcipt>

上面那段代码其实是行不通的,因为函数定义时的参数个数和函数调用时的参数个数没有任何关系。 在函数中可以用f.arguments[0]和f.arguments[1]得到调用时传入的第一和第二个参数,所以定义function(length),后面用f(10,10)调用是没有问题的。所以在上面这段代码中,第二个函数是永远不可能被调用到的,那么,要怎样才能实现像函数重载那样的功能呢?
那就是在函数定义中用f.arguments.length判断一下调用时传入的参数个数。然后对不同的情况采用不同的处理方式。
如下:
<script language="JavaScript"> 
function f() 
{ 
var len= arguments.length; 
if(1 == len) 
{ 
var length = arguments[0]; 
var width = arguments[1]; 
f2(length,width); 
} 
else 
{ 
var length = arguments[0]; 
f1(length); 
} 
} 
function f1(length) 
{ 
alert("高为:"+length); 
} 
function f2(length,width) 
{ 
alert("高为:"+length+",宽为:"+width); 
} 
</srcipt>

这样,你就可以给函数f()传入一个参数也可以传入两个参数了,比如f(10)和f(10,10);
个人觉得,这样虽然可以实现重载,但也不是很好用,我们可以根据具体情况在一个函数中实现重载,如果要重载的两个函数相差较大,那就保留两个函数,而如果两个函数的实现基本差不多,那么可以在一个函数中进行判断,处理不同的部分,而不需要像上面那样写成三个函数,如下:
<script language="JavaScript"> 
function f(length) 
{ 
var len= arguments.length; 
if(1 == len) 
{ 
var width = arguments[1]; 
alert("高为:"+length+",宽为:"+width); 
} 
else 
{ 
alert("高为:"+length); 
} 
} 
</srcipt>



>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
以下备份一个可作参考,不同类型重载的例子
<script type='text/javascript'>

function ABC()
{
    this.member = 1;
    this.method = Show;
}
function Show(a,b,c)
{
    this.member = 123;
    if(arguments.length==1)
        if(arguments[0].constructor == Number)
            Show1_int.apply(this, arguments);
        else if(arguments[0].constructor == Date)
            Show1_date.apply(this, arguments);
        else
            Show1_string.apply(this, arguments);
    if(arguments.length==2)
        if(arguments[0].constructor == Array)
            Show3.apply(this,arguments);
        else
            Show2.apply(this,arguments);
}
function Show1_int(a)
{
    alert('1 integer input parameter ' + a+ '  methode is called');
}
function Show1_string(a)
{
    alert('1 string input parameter ' + a+ '  methode is called');
}
function Show1_date(a)
{
    alert('1 date input parameter ' + a+ '  methode is called');
}

function Show2(a,b)
{
    alert('2 input parameter is transfer:\na:'+a+'\nb:'+b + '\nthe member is' + this.member);
}
// 演示引用方式传递
function Show3(a,b)
{
    arguments[0][0]=2;
    alert('2 input parameter is transfer:\na:'+a+'\nb:'+b + '\nthe member is' + this.member);
}
var o = new ABC();
var arr = new Array();
arr[0]=321;
o.method(arr[0],2);    // 值传递
alert(arr[0]);        // 原始值未改变
o.method(arr,2);    // 引用方式传递
alert(arr[0]);        // 方法调用时被方法修改
o.method(new Date());

</script>
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics