2012-04-07 10 views
5
// I am trying to make a clone of String's replace function 
// and then re-define the replace function (with a mind to 
// call the original from the new one with some mods) 
String.prototype.replaceOriginal = String.prototype.replace 
String.prototype.replace = {} 

Diese nächste Zeile ist jetzt gebrochen - wie repariere ich?So ersetzen Sie JavaScript-Prototyp mit benutzerdefinierter Funktion

"lorem ipsum".replaceOriginal(/(orem |um)/g,'') 
+4

Es funktioniert gut für mich (in Firefox). Es könnte helfen, wenn Sie erklären würden, was "kaputt" bedeutet. – Pointy

+1

Einverstanden, es funktioniert auch in Chrome gut: http://jsfiddle.net/4hPhG/ –

+0

Das einzige, was ich sehe, ist falsch in Ihrem Code ist die fehlende ';' auf der ersten Aussage. –

Antwort

16

Das einzige mögliche Problem ist, dass der Code zweimal ausgeführt wird, was Probleme verursacht: Die eigentliche Original .replace verschwinden.

solche Probleme zu vermeiden, empfehle ich dringend die Verwendung des folgenden allgemeinen Verfahrens integrierten Methoden zu ersetzen:

(function(replace) {       // Cache the original method 
    String.prototype.replace = function() { // Redefine the method 
     // Extra function logic here 
     var one_plus_one = 3; 
     // Now, call the original method 
     return replace.apply(this, arguments); 
    }; 
})(String.prototype.replace); 
  • mehrere Verfahren Modifikationen Dies ermöglicht ohne brechen bestehende Funktionalität
  • Der Kontext ist Bewahrt durch .apply(): Normalerweise ist das Objekt this für (Prototyp-) Methoden unerlässlich.
+0

Es kann andere Probleme geben. Zum Beispiel (nur hypothetisch) ist 'replace' rekursiv und ruft in bestimmten Fällen" sich selbst "mit' this.replace (...) 'mit anderen Parametern auf (außer dass es sich selbst nicht als eine andere inkompatible Methode bezeichnen würde). Im Allgemeinen wird das Ersetzen einer vordefinierten Methode durch eine inkompatible Methode nicht funktionieren, wenn Sie nicht genau wissen, welche vordefinierte Methode welche Methode aufruft. Dies unterscheidet sich nicht vom Ersetzen einer Funktion durch eine inkompatible Funktion in einer normalen Bibliothek, ohne den Abhängigkeitsgraphen zu kennen. – 6502

+0

Das war genau richtig - ich habe zweimal ausgeführt, also wurde das Original überschrieben. Schülerfehler. Danke für die gründliche Antwort mit einigen anderen nützlichen Tipps. –

Verwandte Themen