2012-07-08 59 views
8

我需要修复Parse.Object库的save函数中的一个错误。但是,当我尝试在覆盖的原型中调用原始函数save时,它会递归循环直到堆栈溢出!扩展原型函数而不覆盖它

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

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

如何更改无限循环行来调用parse所生成的原始函数?

谢谢!

+0

我喜欢这个问题,但仍然无法找到适合我的答案,即使是来自@xdazz的答案。 – Ryan 2017-01-29 20:26:31

回答

18

试试这个:

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

你能解释一下这里发生了什么吗?或者是一些链接。谢谢 – Adi 2012-07-08 07:48:12

+3

@Adnan您需要将旧的保存方法保存到变量中,这样,使用函数参数'save'。 – xdazz 2012-07-08 07:52:56

+0

谢谢@xdazz – Adi 2012-07-08 07:53:25

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

工作,但给JSHint错误“包装立即功能职业在括号中“https://jslinterrors.com/wrap-an-immediate-function-invocation-in-parentheses – 2015-12-31 03:49:27

0

类似接受的答案,但也许有点更容易理解

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