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 = {} 

La siguiente línea ahora está rota, ¿cómo la corrijo?Cómo reemplazar el javascript prototype con la función personalizada

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

Funciona bien para mí (en Firefox). Podría ser útil que explique qué significa "quebrado". – Pointy

+1

De acuerdo, también funciona bien en Chrome: http://jsfiddle.net/4hPhG/ –

+0

Lo único que puedo ver que está mal en tu código es el ';' que falta en la primera declaración. –

Respuesta

16

El único problema posible es que su código se ejecuta dos veces, lo que causa problemas: El verdadero original de .replace desaparecerán.

Para evitar este tipo de problemas, que recomienda el cambio de métodos incorporados utilizando el siguiente método general:

(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); 
  • Esto permite que varias modificaciones del método sin romper la funcionalidad existente
  • El contexto es preservado por .apply(): por lo general, el objeto this es vital para los métodos (prototipo).
+0

Puede haber otros problemas. Por ejemplo (simplemente hipotéticamente) que 'replace' es recursivo y en ciertos casos se llama a sí mismo usando' this.replace (...) 'con diferentes parámetros (excepto que no se llamaría a sí mismo sino a otro método incompatible). En general, reemplazar un método predefinido por uno incompatible no va a funcionar a menos que también sepa exactamente qué método predefinido llama a cuál. Esto no es diferente de reemplazar una función con una incompatible en una biblioteca normal sin conocer el gráfico de dependencia. – 6502

+0

Esto fue exactamente correcto: lo estaba ejecutando dos veces, por lo que se sobrescribió el original. Error de colegial. Gracias por la respuesta completa con algunos otros consejos útiles. –

Cuestiones relacionadas