js方法链尾

时间:2015-02-06 08:50:56

标签: javascript fluent method-chaining

有没有办法检测链(Fluent接口)中的方法调用是否在该链中的TAIL位置?

var some = g.f(arg1).f(arg2).f(arg3);

或者我们绝对需要像

这样的东西
var some = g.f(arg1).f(arg2).f(arg3).end();

我想避免吗?

翻新的价值对我来说并不那么重要,但我需要在链的末尾计算一些东西(一个类似内部字符串的键),从一个调用到另一个调用可能有不同的长度。

1 个答案:

答案 0 :(得分:0)

不,如果函数调用看起来相同,则无法检测给定方法是否处于尾部位置,因为下一个链接调用尚未发生且解释器没有为您提供是否存在其他方法的证据链接调用即将到来。


您可以选择第二个参数作为您正在寻找的线索:

var some = g.f(arg1).f(arg2).f(arg3, "end");

然后,你的f()函数只会检查第二个参数是否存在并且具有适当的值,如果是,它可以执行尾部操作。


或者,您可以制作一个名为f() fTail()的{​​{1}}略有不同的版本(或任何您想要的名称):

var some = g.f(arg1).f(arg2).fTail(arg3);

fTail()可能如下所示:

xxx.prototype.fTail = function() {
    var retVal = this.f.apply(this, arguments);

    // now do your tail operations here

    return retVal;
};

正如你所提议的那样,我认为我会使用一系列args,因为它似乎可以解决你所有的问题,易于使用并且性能良好:

var some = g.f([arg1, arg2, arg3], fn);