Change/Wrap 来自原型的函数
Change/Wrap a function from prototype
我正在编写一个框架,该框架使用函数包装来创建调试工具。目前,我想在函数调用时报告和汇总信息。我正在使用以下代码:
function wrap(label, cb) {
return function () {
report(label);
cb.apply(this, arguments);
}
}
然后为了绑定调试操作,我将使用:
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);
}
};
感谢您对此事的任何见解。
The requirement I have is to now change this syntax so that the wrapping is done via:
funcToWrap.wrap("ContextLabel");
除非开头有一个funcToWrap =
,否则您根本无法满足该要求。没有办法改变函数的内容,你只能做你正在做的,创建一个新的函数来取代它。
如果开头有一个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) 如果是的话,您本可以做到的。
The requirement I have is to now change this syntax so that the wrapping is done via:
funcToWrap.wrap("ContextLabel");
那是不可能的。不能从外部改变函数的行为,在这方面它很像一个不可变的原始值。您唯一可以做的就是创建一个新函数并覆盖旧函数,但这种覆盖必须是显式的。您可以为此使用一些 eval
魔法(如 here),但我建议使用第一个示例中的赋值(无论 wrap
函数是静态函数还是 Function
方法)。
我正在编写一个框架,该框架使用函数包装来创建调试工具。目前,我想在函数调用时报告和汇总信息。我正在使用以下代码:
function wrap(label, cb) {
return function () {
report(label);
cb.apply(this, arguments);
}
}
然后为了绑定调试操作,我将使用:
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);
}
};
感谢您对此事的任何见解。
The requirement I have is to now change this syntax so that the wrapping is done via:
funcToWrap.wrap("ContextLabel");
除非开头有一个funcToWrap =
,否则您根本无法满足该要求。没有办法改变函数的内容,你只能做你正在做的,创建一个新的函数来取代它。
如果开头有一个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) 如果是的话,您本可以做到的。
The requirement I have is to now change this syntax so that the wrapping is done via:
funcToWrap.wrap("ContextLabel");
那是不可能的。不能从外部改变函数的行为,在这方面它很像一个不可变的原始值。您唯一可以做的就是创建一个新函数并覆盖旧函数,但这种覆盖必须是显式的。您可以为此使用一些 eval
魔法(如 here),但我建议使用第一个示例中的赋值(无论 wrap
函数是静态函数还是 Function
方法)。