从原型更改/包装函数

Change/Wrap a function from prototype

本文关键字:包装 函数 原型      更新时间:2023-09-26

我正在编写一个框架,该框架使用函数包装来创建调试工具。目前,我想在函数调用时报告和聚合信息。我使用以下代码:

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方法)。