2010-02-02 11 views
20

Czy JS obsługuje dwie funkcje o tej samej nazwie i różnych parametrach?Pomoc z parametrami JS i funkcjami

function f1(a, b) 
{ 
// a and b are numbers 
} 

function f1(a, b, c) 
{ 
// a is a string 
//b and c are numbers 
} 

Czy mogę używać tych funkcji JS dla IE7, FF, Opera bez problemu?

Odpowiedz

32

JavaScript nie obsługuje, co można by nazwać w innych językach metoda przeciążenia, ale istnieje wiele obejścia, jak przy użyciu obiektu arguments, aby skontaktować się z jak wielu argumentów funkcja została wywołana

function f1(a, b, c) { 
    if (arguments.length == 2) { 
    // f1 called with two arguments 
    } else if (arguments.length == 3) { 
    // f1 called with three arguments 
    } 
} 

Dodatkowo można wpisać sprawdzić swoje argumenty, dla numeru i ciąg prymitywów jest bezpieczny w użyciu operatora typeof:

function f1(a, b, c) { 
    if (typeof a == 'number' && typeof b == 'number') { 
    // a and b are numbers 
    } else if (typeof a == 'string' && typeof b == 'number' && 
      typeof c == 'number') { 
    // a is a string, b and c are numbers 
    } 
} 

I są znacznie bardziej zaawansowane techniki, takie jak ten, w następnym artykule, który bierze przewagę niektóre język JavaScript, takich jak zamykanie aplikacji, funkcji, itp, aby naśladować metody przeciążenia:

7

Nie, nie można używać przeciążania funkcji w JS.

Ale można zadeklarować tylko wersję z 3 parametrami, a następnie sprawdzić, czy trzeci argument === undefined i zapewnić zróżnicowane zachowanie na tej podstawie.

+0

W przypadku, gdy rozmówca przechodzi 3rd argumentu, ale jego wartość jest niezdefiniowana * * Ten test nie powiedzie się. Prawdopodobnie lepiej, jeśli zamiast tego funkcja testuje ** arguments.length **. – NVRAM

+0

Jeśli osoba wywołująca używa "niezdefiniowanego" jako trzeciego argumentu, wziąłbym to, aby zasygnalizować, że chcieliby, aby funkcja była traktowana tak, jakby tylko dwie osoby zostały przekazane. Naprawdę nie widzę żadnego innego uzasadnionego celu przejścia w "niezdefiniowanym". –

3

Nie, to nie zadziała, na stronie zostanie zdefiniowana tylko druga funkcja. Here jest źródłem.

1

Nie możesz tego zrobić ... chyba że jest w porządku, abyś miał tylko ostatnią definicję.

0

Można również użyć instanceof, przykład z podstawowym polimorfizmem.

Najpierw utwórz superklasę (piłka)

// superclass 
function Ball() { 
    this.play = function() { 
     alert("Ball throw"); 
    }; 
} 

a teraz przez kilka podklas (rodzaje piłek)

// subclass 
function Basketball() { 
    this.play = function() { 
     alert("basketball throw"); 
    }; 
} 
// subclass 
function Soccerball() { 
    this.play = function() { 
     alert("soccer ball kick/throw"); 
     console.debug("here"); 
    }; 
} 
// subclass 
function Baseball() { 
    this.play = function() { 
     alert("strike 3 you're out"); 
     console.debug("here"); 
    }; 
} 

Daj im funkcjonalność Ball, aka ustawił jeszcze superklasę poprzez prototyp

// set subclass functionality 
Basketball.prototype = new Ball(); 
Soccerball.prototype = new Ball(); 
Baseball.prototype = new Ball(); 

Jakiś polimorfizm (utwórz pęczek kul i baw się nimi wszystkimi, ale bazuj na n rodzaj)

var bunchOfBalls = [new Baseball(), new Soccerball(), new Basketball()]; 
for (var i = 0; i < bunchOfBalls.length; i++) { 
    bunchOfBalls[i].play(); 
} 

Teraz napisać funkcję, która przyjmuje piłkę, ale tylko chcesz pracować dla konkretnego rodzaju piłek (wizualizacja funkcja przeciążenia, bardziej lub mniej)

//overloading dependent upon type 
function BasketbalOrBaseballOnlyPlay(aBall) { 
    if (aBall instanceof Basketball) { 
     //special basketball function 
    } 
    if (aBall instanceof Baseball) { 
     //special baseball function 
    } 

} 

Jeśli aBall jest Koszykówka więc aBall = new Basketball(); następnie aBall instanceof Basketball zwróci true dla koszykówki i false dla baseball, ale prawdziwe dla Ball.

Tak więc aBall instanceof Ball powrócił prawdą, ponieważ koszykówka jest piłką.

See code live at http://jsfiddle.net/kLCPB/