从原型改变/包装一个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
方法)。