如何在JavaScript中检测方法链的结束?

Xax*_*xis 9 javascript jquery jquery-plugins

首先,最重要的是,我正在尝试检测方法链的结束调用.我还想设法一种方法来检测我在方法链中的方法调用中有多少方法"进入"或"向下"一个对象链.

例如,在我写的插件中:

var result = $("#someDiv").myPlugin.foo().bar()._foo()._bar();
Run Code Online (Sandbox Code Playgroud)

假设该方法当前正在.bar()中执行我想知道我是链中的两种方法.

我需要以某种方式抽象这些信息的原因是当我到达链中的最后一个方法时,我可以返回一个结果而不是插件对象,从而在该点打破链,以便获取对我们数据的访问权限. '结果'变量.

Gri*_*inn 5

这是从您的项目中提取的示例:

var strLenA = parseInt( P.strlen('some string').data );
var strLenB = parseInt( P.strlen('another string').data );
var totalStrLen = strLenA + strLenB;
console.log(strLenA, strLenB, totalStrLen);
Run Code Online (Sandbox Code Playgroud)

从这里我可以看出为什么我们的答案并不充分 - 以及为什么你想摆脱.data. 令人高兴的是,无论如何,你.data总是返回一个字符串。因此,您可以使用神秘的.toString覆盖来让您的方法仍然返回父方法的副本 - 但也允许将它们视为字符串。

这是一个例子:[用小提琴]

var stringMagic = function() {
    var chain = "",
        self = this;
    self.toString = function () { return chain; }; // Where the real magic happens.
    self.add = function(str) {
        chain += str + " ";
        return self;
    };
};


var magi = new stringMagic();
alert(magi.add("hello").add("world")); // Alerts, "hello world"
magi.add("and").add("thanks").add("for").add("all").add("the").add("fish");
alert(magi); // Alerts, "hello world and thanks for all the fish"
Run Code Online (Sandbox Code Playgroud)

就您而言,可能您所要做的就是更改为.data并将其包装在函数中。P.toString

将来当您添加对数字和布尔值等其他数据类型的支持时,您可以valueOf像使用toString. 事实上,您还应该继续包括toString返回值不是字符串的情况,以及当他们将该数字视为字符串时的情况 - 就像在console.logor中一样$.fn.text。这是上面的示例,但带有数字:http://jsfiddle.net/emqVe/1/


ern*_*rn0 1

没有(合法的或简单的或好的)方法可以找出方法内部结果在返回后发生了什么。您应该使用“链末端标记”方法。

再想一想,您是在寻找应用于对象的最后一个方法,还是想检测一些更明确的东西?也许您失去了在决策上应用方法的可能性(使用虚假的愚蠢方法名称):

obj.turnLeft().pushUp().makeBig().makeSilent;
if (colorSupport) {
  obj.paintRed();
} else {
  obj.paintStripes();
}
obj.makeShine().lastMethodCallSoObjectIsNowInFinalState();
Run Code Online (Sandbox Code Playgroud)