【问题标题】:Change/Wrap a function from prototype从原型更改/包装函数
【发布时间】:2015-03-18 19:25:53
【问题描述】:

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

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);
    }
};

感谢您对此事的任何见解。

【问题讨论】:

  • 请注意,您的包装函数在cb.apply(…) 之前缺少return
  • @TravisJ:arguments 是一个内置功能:它是调用函数时提供的运行时参数的伪数组。因此,OP 的 wrap 正在返回一个函数,该函数正确地重用了调用它的 this 和调用它的参数。 (正如 Bergi 指出的那样,它缺少 return。)
  • @TravisJ:我第一次看到它时也犯了同样的错误。 :-)

标签: javascript node.js this wrapper


【解决方案1】:

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

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) 如果是的话,你本可以做到的。

【讨论】:

  • 谢谢。你没有弄错要求,这个想法是尽可能轻松地使用它。关于最后一个建议,它与使用原始解决方案类似,因此不多赘述。但再次感谢您。
  • @NitaiJ.Perez:是的,没错。恐怕主要答案是“你不能那样做”(只改变一个函数的胆量)。
【解决方案2】:

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

funcToWrap.wrap("ContextLabel");

那是不可能的。不能从外部改变函数的行为,在这方面它很像一个不可变的原始值。您唯一能做的就是创建一个新函数并覆盖旧函数,但这种覆盖必须是明确的。您可以为此使用一些 eval 魔法(例如 here),但我建议您使用第一个示例中的赋值(无论 wrap 函数是静态函数还是 Function 方法)。

【讨论】:

  • 感谢您的评论。我宁愿不惜一切代价避免使用 eval 。我希望能够解决一些问题,但显然不是。
猜你喜欢
  • 2011-05-03
  • 1970-01-01
  • 2012-03-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-06
  • 1970-01-01
相关资源
最近更新 更多