JS - 停止对象链方法而不会出错

时间:2013-03-05 09:43:52

标签: javascript oop

我们有一些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()错误的错误。

那么如何使所有链返回false而不会出现任何错误的'ring'返回false?

FIDDLE

3 个答案:

答案 0 :(得分:3)

您必须更改条形的返回类型。我建议为此目的创建一种null对象,并在链的末尾添加一个finalization方法,该方法为null对象返回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()

<强> Fiddle

答案 1 :(得分: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;
    }
};

答案 2 :(得分:0)

方法链可能有点危险。这完全与依赖关系有关。

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

如果它们不完全相同,例如它们不是所有字符串,那么将链分解为单独的语句是个好主意。或者可能将它们提取到一个单独的函数中。

假设您有一些链,例如

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

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

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

好像我们看看

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

所有只处理String对象。

有关详细信息,请参阅Law of Demeter