从原型改变/包装一个function

我正在写一个框架,使用函数的包装来创build一个debugging工具。 目前,我想通过函数调用来汇报和汇总信息。 我使用下面的代码:

function wrap(label, cb) { return function () { report(label); cb.apply(this, arguments); } } 

然后为了绑定debugging操作,我将使用:

 function funcToWrap (){/* Some existing function*/} funcToWrap = wrap("ContextLabel", funcToWrap); 

现在,当funcToWrap被调用时,它将通过report()方法连线。

我的要求是现在改变这个语法,以便通过以下方式完成包装:

 funcToWrap.wrap("ContextLabel"); 

理想情况下,这样的事情会解决我的问题,但这当然是非法的:

 Function.prototype.time = function(label){ var func = this; // The actual difference: this = function () { // ILLEGAL report(label); func.apply(this, arguments); } }; 

感谢您对此有所了解。

我的要求是现在改变这个语法,以便通过以下方式完成包装:

 funcToWrap.wrap("ContextLabel"); 

除非在开始时有一个funcToWrap = ,否则你根本无法达到这个要求。 没有办法改变function的胆量,你只能做你正在做的事情,创build一个新的function取代它。

如果你有一个funcToWrap =开头,当然,这是非常简单的。 但我认为这不是要求。


但是,如果我错误地要求,那么:

 Function.prototype.wrap = function wrap(label) { var f = this; return function () { report(label); return f.apply(this, arguments); // Note the added `return` here }; }; 

用法:

 funcToWrap = funcToWrap.wrap("ContextLabel"); 

但是,从这个问题上合理地确定:A)那不是你要找的东西,B)如果是的话,你可以做到。

我的要求是现在改变这个语法,以便通过以下方式完成包装:

 funcToWrap.wrap("ContextLabel"); 

这不可能。 一个人不能从外面改变一个函数的行为,就像在这方面不可改变的原始值。 你唯一能做的就是创build一个新的函数并覆盖旧函数,但是这个覆盖必须是明确的。 你可以使用一些eval魔术(比如这里 ),但是我build议像第一个例子那样使用一个赋值(不pipewrap函数是静态还是Function方法)。

Interesting Posts