如何在JavaScript/jQuery中实现重载?

如何在JavaScript/jQuery中实现重载?,javascript,oop,dom-events,Javascript,Oop,Dom Events,我试图调用具有相同签名的函数 示例:有两个同名函数: <script> var obj1,obj2,obj3,obj4,obj5; function OpenBox(obj1,obj2){ // code } function OpenBox(obj1,obj2,obj3,obj4,obj5){ // code } </script> 变量obj1、obj2、obj3、obj4、obj5; 功能打开框(obj1、

我试图调用具有相同签名的函数

示例:有两个同名函数:

<script>
    var obj1,obj2,obj3,obj4,obj5;
    function OpenBox(obj1,obj2){
    // code
    }
    function OpenBox(obj1,obj2,obj3,obj4,obj5){
    // code
    }
</script>

变量obj1、obj2、obj3、obj4、obj5;
功能打开框(obj1、obj2){
//代码
}
功能打开框(obj1、obj2、obj3、obj4、obj5){
//代码
}
当我在链接的click事件上调用函数时

<a id='hlnk1' href='#' onclick='OpenBox(this,\"abhishek\"); return false;'> Open Box </a>

当我点击上面的链接时,它正在调用函数OpenBox(obj1、obj2、obj3、obj4、obj5){

它应该是调用函数OpenBox(obj1,obj2){}


函数出了什么问题?

javascript不能在同一范围内定义重复的函数。检查是2还是5。马特的想法是正确的。因为javascript没有类型,所以这些函数是等价的。你可以这样做:

function OpenBox_impl1(obj1,obj2){
    // code
}
function OpenBox_impl2(obj1,obj2,obj3,obj4,obj5){
    // code
}

function OpenBox(obj1, obj2, obj3, obj4, obj5) {
    if(arguments.length == 2)
        return OpenBox_impl1(obj1, obj2);
    else
        return OpenBox_impl2(obj1,obj2,obj3,obj4,obj5);
}
@阿布希克

没有什么能像c#或java那样。JavaScript的行为是这样的

function Test(arg1 ,arg2 , arg3, arg4)
{

}
调用此函数时,可以通过以下方式调用

Test(arg1);
Test(arg1,arg2);
Test(arg1,arg2,arg3);
Test(arg1,arg2,arg3,arg4);

但是顺序很重要,所以您可以通过上述方法来调用函数。

您不能在JavaScript中重载函数。相反,将使用函数的最新定义版本,这就是为什么在您的示例中会调用带有5个参数的版本(最后3个参数只是
未定义的

有几种方法可以解决这个问题,其中一种方法在米科拉的回答中有所体现。另一种方法是传入一个对象,然后在函数中检查该对象的内容(请参阅):

另一个选项是检查
参数。长度

function foo(a, b) {
    if(arguments.length > 2) {
        var arg3 = arguments[3];
        //etc...
    }
}

问题是您试图重载一个函数,但Javascript不支持。我认为最好的选择是使用多态性。查看本文了解更多详细信息:

在ecmascript中定义函数后,该名称将被锁定。但是,您可以向该函数传递任意数量的参数,以便在内部完成其余工作

function foo(arg1, arg2) {
    // any code that is needed regardless of param count

    if(arg2 !== undefined) {
        // run function with both arguments
        console.log(arguments);
    } else if(arg1 !== undefined) {
        // run function with one argument
    } else {
        // run function with no arguments
    }
}

foo(1);
foo(1,2);
foo(1,2,3);

有趣的注意:您可以传入函数声明中没有的额外参数。做一个
控制台。记录
参数
,你会看到里面的一切
arguments
是一个
对象
,可以像访问
数组一样进行类型转换

在多态性中,您可以使用不同的签名方法,在javascript中,我们可以模拟多态性检查函数参数的类型并执行特定任务

var input = document.getElementById('data');
polymorphism(input);
polymorphism('Hello word 2');
polymorphism('hello word 3', 5);

function polymorphism(arg,arg1){ 
  var string = null;
  var sqr = 0;
  if(typeof arg === 'string'){
    string = 'arg type String: \n'+arg;
  }else if (arg.tagName && arg.tagName === 'INPUT'){
    string = 'arg type Input: \n'+arg.value;
  }
  if(arg1 && typeof arg1 === 'number'){
    sqr = arg1*arg1;
    alert(string + ' and sqr = '+sqr);
  }else {
    alert(string);
  }    
}

'OpenBox(这个,\'abhishek\')中选中此示例,返回false;'
应该是
'OpenBox(这个“阿披舍克”)返回false;'阅读这个问题的答案:@lbu-避开引号,虽然在这种情况下不是必需的,但实际上并不有害,是吗?我更关心的是,在结束括号和返回之间没有分号。我只想指出,对于阅读这个问题作为搜索的一部分的人来说,阿披舍克所描述的是方法重载,而不是多态性。多态性是遵守特定接口或契约的能力。Javascript是一种鸭子类型的语言,具有隐含多态性。@Randolpho感谢您对其进行了很好的描述。感谢@Joe_Francis的回复。是的,Jackson是的。。我可以通过arguments对象访问所有参数吗?您也可以在没有参数或5+参数的情况下调用它。
var input = document.getElementById('data');
polymorphism(input);
polymorphism('Hello word 2');
polymorphism('hello word 3', 5);

function polymorphism(arg,arg1){ 
  var string = null;
  var sqr = 0;
  if(typeof arg === 'string'){
    string = 'arg type String: \n'+arg;
  }else if (arg.tagName && arg.tagName === 'INPUT'){
    string = 'arg type Input: \n'+arg.value;
  }
  if(arg1 && typeof arg1 === 'number'){
    sqr = arg1*arg1;
    alert(string + ' and sqr = '+sqr);
  }else {
    alert(string);
  }    
}