Jak zastąpić funkcję JavaScript


109

Próbuję zastąpić wbudowaną parseFloatfunkcję w JavaScript .

Jak bym to zrobił?


9
nie polecałbym tego robić. może stworzyć inną funkcję w prototypie?
KJYe.Name 葉家仁

Mógłbyś po prostu zrobić function parseFloat() {}, ale o ile wiem, nie ma wtedy sposobu na wywołanie wersji natywnej.
pimvdb

Funkcja nadpisywania jest bardzo powszechną praktyką.
Jerry Liang

Odpowiedzi:


231
var origParseFloat = parseFloat;
parseFloat = function(str) {
     alert("And I'm in your floats!");
     return origParseFloat(str);
}

Czy można również wywołać wersję natywną wewnątrz niestandardowego parseFloat? Próbowałem tego, ale wyświetla się błąd „Przekroczono maksymalny rozmiar stosu wywołań”: jsfiddle.net/huZG2 . Dzięki.
pimvdb

1
Twój sznurek jest uszkodzony :)
Marcelo

2
@David Waters: Obawiam się, że Twój obecny kod na zawsze wyświetla alerty w Chrome.
pimvdb

11
@David Pamiętaj, że funkcja jest podniesiona, co oznacza, że origParseFloatwskazuje na funkcję, którą deklarujesz zaraz po. To by zadziałało.
HoLyVieR

1
@HoLyVieR dzięki Naprawiono przez przypisanie funkcji do nazwy odpowiedź zaktualizowano patrz jsfiddle.net/huZG2/6
David Waters

45

Możesz nadpisać dowolną wbudowaną funkcję, po prostu ponownie ją deklarując.

parseFloat = function(a){
  alert(a)
};

Teraz parseFloat(3)zaalarmuje 3.


Ale w tej odpowiedzi nie ma pojęcia nadpisywania funkcji, tj. Nadpisywania funkcjonalności, ale utrzymywania tej samej nazwy funkcji.
Ahsan

18

Możesz to nadpisać lub najlepiej rozszerzyć jego implementację w ten sposób

parseFloat = (function(_super) {
    return function() {
        // Extend it to log the value for example that is passed
        console.log(arguments[0]);
        // Or override it by always subtracting 1 for example
        arguments[0] = arguments[0] - 1;
        return _super.apply(this, arguments);
    };         

})(parseFloat);

I nazwij to tak, jak zwykle to nazywasz:

var result = parseFloat(1.345); // It should log the value 1.345 but get the value 0.345

9

Możesz to zrobić w ten sposób:

alert(parseFloat("1.1531531414")); // alerts the float
parseFloat = function(input) { return 1; };
alert(parseFloat("1.1531531414")); // alerts '1'

Sprawdź działający przykład tutaj: http://jsfiddle.net/LtjzW/1/

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.