Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How can implement overloading in JavaScript/jQuery?

Im trying to call functions with same signature.

Example: There are two functions with same name:

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

When I calling function on click event of link

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

When I click on the above link it is calling function OpenBox(obj1,obj2,obj3,obj4,obj5){}

It should be call function OpenBox(obj1,obj2){} Instead.

What's going wrong in functions?

like image 496
Abhishek B. Avatar asked Jun 24 '11 06:06

Abhishek B.


People also ask

How method overloading is implemented in JavaScript?

Example 1: Using if/else-if Statement In the above program, the overloading feature is accomplished by using the if/else...if statement. In JavaScript, the arguments object is automatically available inside a function that represents the passed arguments to a function.

Can we overload method in JavaScript?

Unlike the other programming languages, JavaScript Does not support Function Overloading.

How is overloading implemented?

In Java, two or more methods may have the same name if they differ in parameters (different number of parameters, different types of parameters, or both). These methods are called overloaded methods and this feature is called method overloading. For example: void func() { ... }

Does JavaScript support overriding or overloading concept?

JavaScript does not support overloading. JavaScript supports overriding, so if you define two functions with the same name, the last one defined will override the previously defined version and every time a call will be made to the function, the last defined one will get executed.


7 Answers

mattn has the correct idea. Because javascript has no typing those functions are equivalent. What you could do is something like this:

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);
}
like image 56
Mikola Avatar answered Oct 23 '22 18:10

Mikola


javascript can't define duplicate function in same scope. check arguments.length are 2 or 5.

like image 38
mattn Avatar answered Oct 23 '22 17:10

mattn


You cannot overload functions in JavaScript. Instead, the most recently defined version of the function will be used, which is why in your case the version with 5 parameters is called (the final 3 are just undefined).

There are several ways around this, one if which is shown in Mikola's answer. An alternative is to pass in an object, and then check the contents of that object in the function (see this question):

function foo(a, b, opts) {

}

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

Another option is to check arguments.length:

function foo(a, b) {
    if(arguments.length > 2) {
        var arg3 = arguments[3];
        //etc...
    }
}
like image 21
James Allardice Avatar answered Oct 23 '22 17:10

James Allardice


in the polymorphism you can use a different signature method ,in javascript we can simulate polymorphism checking the type of the function parameter and execute certain task.

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);
  }    
}

Check this example in JSFIDDLE

like image 39
Yonatan Alexis Quintero Rodrig Avatar answered Oct 23 '22 19:10

Yonatan Alexis Quintero Rodrig


@abshik ,

There is nothing like that which is similar to c# or java. Javasccript behaves this way

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

}

when you are calling this function you can call in the following ways

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

But sequence matters , so you can the function in the above ways.

like image 36
kobe Avatar answered Oct 23 '22 18:10

kobe


The issue is that you are trying to overload a function but that is not supported by Javascript. I think your best option is to use Polymorphism instead. View this article for more details: http://www.cyberminds.co.uk/blog/articles/polymorphism-in-javascript.aspx

like image 29
Joe Francis Avatar answered Oct 23 '22 17:10

Joe Francis


Once a function is defined in ecmascript, that name is locked. However, you can pass any number of parameters to that function so you do the rest of the work on the inside.

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);

Interesting note: you can pass in extra parameters that aren't in the function declaration. Do a console.log of arguments and you'll see everything in there. arguments is an object which can be accessed like / typecasted to an array.

like image 21
Jacksonkr Avatar answered Oct 23 '22 18:10

Jacksonkr