从原型更改/包装函数
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);
}
};
感谢您对这方面的任何见解。
我现在的要求是更改此语法,以便通过以下方式完成包装:
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)如果是的话,你本可以做到的。
我现在的要求是更改此语法,以便通过以下方式完成包装:
funcToWrap.wrap("ContextLabel");
这是不可能的。不能从外部改变函数的行为,在这方面它很像一个不可变的原始值。你唯一能做的就是创建一个新函数并覆盖旧函数,但这种覆盖必须是明确的。您可以使用一些eval
魔术(如这里所示),但我建议使用第一个示例中的赋值(无论wrap
函数是静态的还是Function
方法)。
相关文章:
- 如何使用图表包装函数有条件地格式化谷歌可视化表单元格
- 从原型更改/包装函数
- 我正在尝试使用 html 元素包装函数的返回值
- 将 ajax .done 作用域扩展到包装函数
- 在javascript中需要帮助包装函数并正确处理“this”
- 包装函数后无法读取属性
- 检查是否调用了包装函数
- 从生成器函数中包装co和co-mysql,并从包装函数中让步
- 窗口对象上具有全局变量的包装函数
- 使用removeEventListener删除包装函数回调
- 用JavaScript正确包装函数
- 如何从包装函数返回javascript ajax调用的结果
- 如何包装函数调用,有时做异步调用,使其行为同步
- 为什么UnderscoreJS有很多原生Javascript函数的包装函数?
- Knockout - keyCode属性没有通过包装函数传递
- Highcharts包装函数'
- 中间javascript: ajax请求的包装函数稍后执行主函数
- 是否有一种聪明的方法来访问包装函数中的变量
- Jquery新手在包装函数时遇到问题
- express 4的异步包装函数没有't捕获错误