我正在使用https://stackoverflow.com/a/1833851克隆一个函数,以便我可以覆盖它。例如:
Function.prototype.clone = function() {
var that = this;
var temp = function temporary() { return that.apply(this, arguments); };
for(var key in this) {
if (this.hasOwnProperty(key)) {
temp[key] = this[key];
}
}
return temp;
};
window.capture_list = [];
window.handler_clone = window.YAHOO.handleData.clone();
window.YAHOO.handleData = function(oRequest, oResponse, oData){
window.capture_list.push( {'oRequest': oRequest, 'oResponse': oResponse, 'oData': oData} );
return window.handler_clone( oRequest, oResponse, oData );
};
这似乎可以完成任务,但我在实践中得到了“Maximum call stack size exceeded error”。
似乎我正在使用的克隆方法以某种方式递归到自身......我认为由于我有限的js经验,我对这个克隆实现有些误解。
有关此递归位置的任何想法,或者如何更好地实现克隆以覆盖?我真的只是试图拦截传递给handler()的参数。谢谢!
handleData函数:
window.YAHOO.handleData = function(oRequest, oResponse, oData) {
if (oData == null) {
oData = {}
}
oData.totalRecords = oResponse.meta.totalRecords;
return oData
};
答案 0 :(得分:0)
逐步完成:
克隆副本this
然后将任何参数应用于原始函数,然后迭代函数中的键(我假设获取原型属性?),然后将其返回。
好像你正在尝试创建装饰器?
在任何情况下,我都不确定为什么你没有选择使用bind
它会在传入的上下文中创建一个新函数。
更多信息:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/bind