2012-07-08 16 views
8

Necesito reparar un error en la función save de la biblioteca Parse.Object. Sin embargo, cuando intento llamar a la función original save en mi prototipo sobrescrito, ¡se repite hasta que la pila se desborda!Extendiendo la función del prototipo sin sobreescribirlo

Parse.Object.prototype.save = function (arg1, arg2, arg3) { 
    fixIncludedParseObjects(this); 

    Parse.Object.prototype.save.call(this, arg1, arg2, arg3); // endless loop 
}; 

¿Cómo puedo cambiar la línea de bucle sin fin para llamar a la función original hecha por análisis?

Gracias!

+0

Me encanta esta pregunta, pero todavía no puede encontrar una respuesta que funciona para mí , incluso con la respuesta de @xdazz. – Ryan

Respuesta

18

Prueba esto:

(function(save) { 
    Parse.Object.prototype.save = function (arg1, arg2, arg3) { 
    fixIncludedParseObjects(this); 
    save.call(this, arg1, arg2, arg3); 
    }; 
}(Parse.Object.prototype.save)); 
+3

¿Puedes explicar lo que está pasando aquí? O algún enlace que sí lo hace. Gracias – Adi

+3

@Adnan Debes guardar el viejo método guardar en una variable, de esta manera, usa el parámetro de función 'save'. – xdazz

+0

Gracias @xdazz – Adi

4
Parse.Object.prototype.save = function (save) { 
    return function() { 
     fixIncludedParseObjects(this); 
     //Remember to return and .apply arguments when proxying 
     return save.apply(this, arguments); 
    }; 
}(Parse.Object.prototype.save); 
+1

Funciona, pero da el error JSHint" Ajustar una función inmediata en vocación entre paréntesis "https://jslinterrors.com/wrap-an-immediate-function-invocation-in-parentheses –

0

Al igual que en respuesta aceptada pero quizás un poco más fácil de entender

var originalSaveFn = Parse.Object.prototype.save; 
Parse.Object.prototype.save = function(arg1, arg2, arg3) { 
    fixIncludedParseObjects(this); 
    originalSaveFn.call(this, arg1, arg2, arg3); 
}; 
Cuestiones relacionadas