So überschreiben Sie eine JavaScript-Funktion

109

Ich versuche, eine parseFloatin JavaScript integrierte Funktion zu überschreiben .

Wie würde ich das machen?

Riz
quelle
9
Ich würde das nicht empfehlen. Vielleicht eine andere Funktion innerhalb des Prototyps erstellen?
KJYe.Name 葉家仁
Sie könnten es einfach tun function parseFloat() {}, aber es gibt meines Wissens keine Möglichkeit, die native Version dann tatsächlich aufzurufen.
Pimvdb
Das Überschreiben von Funktionen ist weit verbreitet.
Jerry Liang

Antworten:

231
var origParseFloat = parseFloat;
parseFloat = function(str) {
     alert("And I'm in your floats!");
     return origParseFloat(str);
}
David Waters
quelle
Ist es auch möglich, die native Version innerhalb einer benutzerdefinierten Version aufzurufen parseFloat? Ich habe es versucht, aber es ist der Fehler 'Maximale Größe des Aufrufstapels überschritten': jsfiddle.net/huZG2 . Vielen Dank.
Pimvdb
1
Ihre Saite ist gebrochen :)
Marcelo
2
@ David Waters: Ich fürchte, Ihr aktueller Code warnt für immer in Chrome.
Pimvdb
11
@ David Beachten Sie, dass die Funktion hochgezogen ist, was bedeutet, dass sie origParseFloatauf die Funktion verweist, die Sie direkt danach deklarieren. Das würde funktionieren.
HoLyVieR
1
@HoLyVieR danke Behoben durch Zuweisen einer Funktion zur Namensantwort aktualisiert aktualisiert jsfiddle.net/huZG2/6
David Waters
45

Sie können jede integrierte Funktion überschreiben, indem Sie sie einfach erneut deklarieren.

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

Jetzt parseFloat(3)wird 3 alarmiert.

Rakete Hazmat
quelle
In dieser Antwort gibt es jedoch kein Konzept für das Überschreiben von Funktionen, dh das Überschreiben von Funktionen, aber das Beibehalten des Funktionsnamens.
Ahsan
18

Man könnte es außer Kraft setzen oder vorzugsweise erweitern sie die Umsetzung wie folgt aus

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

Und nennen Sie es so, wie Sie es normalerweise nennen würden:

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

Sie können es so machen:

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

Schauen Sie sich hier ein funktionierendes Beispiel an: http://jsfiddle.net/LtjzW/1/

Kyle Wild
quelle