Как можно реализовать перегрузку в JavaScript / jQuery? - PullRequest
7 голосов
/ 24 июня 2011

Я пытаюсь вызвать функции с одинаковой подписью.

пример: Есть две функции с одинаковым именем:

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

Когда я вызываю функцию по событию щелчкассылки

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

Когда я нажимаю на вышеуказанную ссылку, она вызывает функцию OpenBox (obj1, obj2, obj3, obj4, obj5) {}

Это должнобыть вызовом функции OpenBox (obj1, obj2) {} Вместо этого.

Что не так в функциях?

Ответы [ 7 ]

13 голосов
/ 24 июня 2011

Мэтн имеет правильную идею.Поскольку в 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);
}
5 голосов
/ 24 июня 2011

JavaScript не может определять дублирующую функцию в той же области.отметьте arguments.length 2 или 5.

2 голосов
/ 16 января 2012

Проблема в том, что вы пытаетесь перегрузить функцию, но это не поддерживается Javascript. Я думаю, что ваш лучший вариант - вместо этого использовать полиморфизм. Посмотрите эту статью для более подробной информации: http://www.cyberminds.co.uk/blog/articles/polymorphism-in-javascript.aspx

2 голосов
/ 24 июня 2011

Вы не можете перегружать функции в JavaScript. Вместо этого будет использоваться последняя определенная версия функции, поэтому в вашем случае вызывается версия с 5 параметрами (последние 3 равны undefined).

Есть несколько способов обойти это, один из которых показан в ответе Миколы. Альтернативой является передача объекта и проверка содержимого этого объекта в функции (см. этот вопрос ):

function foo(a, b, opts) {

}

foo(1, 2, {"method":"add"});
foo(3, 4, {"test":"equals", "bar":"tree"});

Другой вариант - проверить arguments.length:

function foo(a, b) {
    if(arguments.length > 2) {
        var arg3 = arguments[3];
        //etc...
    }
}
2 голосов
/ 24 июня 2011

@ abshik,

Нет ничего подобного тому, что похоже на c # или java. Javasccript ведет себя так

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

}

при вызове этой функции вы можете вызывать следующими способами

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

Но последовательность имеет значение, так что вы можете использовать эту функцию указанными выше способами.

1 голос
/ 24 октября 2014

в полиморфизме вы можете использовать другой метод подписи, в 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);
  }    
}

Проверьте этот пример в JSFIDDLE

1 голос
/ 29 января 2014

Как только функция определена в 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);

Интересное примечание: вы можете передать дополнительные параметры, которых нет в объявлении функции. Сделайте console.log из arguments, и вы увидите там все. arguments - это object, к которому можно получить доступ как / typecasted для array.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...