6

我们有一些 Foo 对象

var Foo = function() {

    this.bar = function(bazinga) {
        if (bazinga) {return this;}
        else {return false;}
    }
    this.show = function() {
        alert('bar');
    }
}; 

所以它允许我们做一些foo.bar().bar().bar().bar();链。

但是如果在链的中间,bar() 将返回 false,下一次 bar() 尝试将导致错误,即undefined has no method bar()whitch 是 ofc 的事情。

那么,当它的任何“环”返回 false 时,如何使所有链返回 false 而没有错误?

小提琴

4

3 回答 3

3

您将不得不更改 bar 的返回类型。我建议为此目的创建一种空对象,并在链的末尾添加一个终结方法,该方法为空对象返回 false:

var Foo = function() {

    var nullFoo = function() {
        this.finalize = function() { return false; }
        this.bar = function() { return this; }
    }
    this.finalize = function() { return this; }
    this.bar = function(bazinga) {
        if (bazinga) {return this;}
        else {return new nullFoo();}
    }
    this.show = function() {
        alert('bar');
    }
}; 

foo.bar().bar().bar().bar().finalize();

对于您的小提琴示例,我没有使用 finalize 方法,而是为 null 对象提供了一个 show 方法。否则你最后仍然会有false.show()

小提琴

于 2013-03-05T09:52:48.807 回答
0

这是你想要的:http: //jsfiddle.net/c24w/MXgzx/5/

JavaScript:

var Foo = function() {

    var returnValue = true;

    this.bar = function(bazinga) {
        returnValue = returnValue && bazinga;
        return this;
    }
    this.show = function() {
        alert('bar');
        return returnValue;
    }
};
于 2013-03-05T09:53:50.143 回答
0

方法链可能有点危险。这一切都与依赖关系有关。

使用方法链时,最好注意链中每个部分返回的对象。

如果它们不完全相同,例如它们不都是字符串,那么最好将链分解为单独的语句。或者也许将它们提取到一个单独的函数中。

假设您有一些链条,例如

somearray.pop().getATagWrapper().getTag().setSrc("http://www.stackoverflow.com")

链的隐式依赖是 Array、Object1、TagWrapper、Tag、String

现在,您编写的函数现在已与所有这些对象耦合,对这些对象的任何更改都可能对您的代码造成严重破坏。

好像我们在哪里看

someString.trim().substr(12).trim().concat("with awesome")

All 只处理 String 对象。

有关更多信息,请参阅得墨忒耳定律

于 2013-03-05T13:13:08.870 回答