重载方法

问题描述:

function Activity() { 

this.LoadFile = function (path, targetElement) { 

    $.ajax({ 
     url: path, 
     dataType: 'html', 
     success: function (data) { 
      targetElement.html(data); 
     } 

    }); 
}; 

this.LoadFile = function (path, targetElement, onSuccess) { 

    $.ajax({ 
     url: path, 
     dataType: 'html', 
     success: function (data) { 
      targetElement.html(data); 
      onSuccess(data); 
     } 

    }); 
}; 

}重载方法

如果我试图通过2个参数,我得到onSuccess is not a function,所以我想这心不是工作。是否有可能在javascipt中使用重载?

有没有直接指定在JS的重载方法是这样的方式。

许多解决方法。

在你的情况,你可以用3个参数定义函数:

function (path, targetElement, onSuccess) 

,如果函数调用只有2个参数,onSuccessundefined

function (data) { 
    targetElement.html(data); 
    if (onSuccess) { 
    onSuccess(data); 
    } 
} 

您可能想要查看jQuery.Callbacks以处理事件回调,但您的功能可以使用.load重写。


对于程序员从Java/C#世界未来超载的学习JavaScript的方式,你可以使用这样的结构(不推荐,它只是为熟悉的例子):

function foo() { 
    var fns = {}; 
    fns[0] = function() { 
    //no params 
    }; 
    fns[1] = function() { 
    //1 param 
    }; 
    fns[2] = function() { 
    //2 params 
    }; 
    fns[arguments.length](); 
} 

为每个“过载”提供单独的功能,但它不是非常灵活,并且症状不好计划的功能


通常情况下,而不是使用大的参数设置,单options参数将被用于包含可用参数:

function foo(options) { 
    var settings = $.extend({}, foo.defaultSettings, options); 
    //do stuff with settings 
} 
foo.defaultSettings = { 
    bar: 'baz', 
    fizz: 'buzz' 
} 
+0

也许它更好地传递一个参数作为一个对象,包含不同数量的参数... – Johan

+1

推荐的结构简直是愚蠢的。告诉他们停止做错了,学习javascript – Raynos

+0

@Raynos,我从来没有推荐过这种结构。我正在试图说明一点。这是荒谬的,因此“功能设计不良的症状”。我想我还不够清楚,所以我会编辑它。 – zzzzBov


JavaScript不支持方法重载。

相反,你就可以说通吃三个参数一个方法,然后检查第三个参数是否实际上是通过方法内。 (所有的JavaScript函数参数都是可选)

+0

好了,任何的替代品? – Johan

+0

@Johan:是的;将该参数视为可选。 – SLaks

还有另外的路要走。不要在函数定义中给出任何参数,然后检查arguments数组()。你甚至可以检查给定参数的类型,以在你的函数内部进行分支。下面的例子将提醒# 1 #Num(2)

/** 
* Usage 
* example(number param1) 
* example(string, number) 
*/ 
function example() { // no parameters 
    if (arguments.length == 1 && typeof arguments[0] == 'number') { 
     alert(' # ' + arguments[0] + ' # ') 
    } 
    if (arguments.length == 2 && typeof arguments[0] == 'string' && typeof arguments[1] == 'number') { 
     alert(arguments[0] + '(' + arguments[1] + ')') 
    } 

} 
example(1); 
example('Num', 2)