Javascript JS-停止对象链方法,无错误

Javascript JS-停止对象链方法,无错误,javascript,oop,Javascript,Oop,我们有一些食物 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()链 但是,如果

我们有一些食物

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()

但是,如果在链的中间,Bar()将返回false,则下一个Bar()尝试会导致错误:<代码>未定义没有方法BAL():/WordCH是OFC的事情。< /P> 那么,当它的任何“环”返回为false时,如何使所有链返回为false而不出错呢


您必须更改酒吧的退货类型。我建议为此创建一种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();
对于您的fiddle示例,我没有使用finalize方法,而是为null对象提供了show方法。否则,最后仍然会出现
false.show()

这就是您想要的:

JavaScript:

var Foo = function() {

    var returnValue = true;

    this.bar = function(bazinga) {
        returnValue = returnValue && bazinga;
        return this;
    }
    this.show = function() {
        alert('bar');
        return returnValue;
    }
};

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

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

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

假设你有一些链子,比如

somearray.pop().getATagWrapper().getTag().setSrc("http://www.stackoverflow.com")
链的隐式依赖项是数组、Object1、标记包装器、标记、字符串

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

好像我们在看什么

someString.trim().substr(12).trim().concat("with awesome")
All只处理String对象


有关更多信息,请参见

+1,它被称为
空对象模式
——如何使用它的好例子!是的,我就是从那里得到这个词的。好的,我知道了。但我担心,如果类变大了,它不会变得棘手,我不是在寻找javascript或jQuery的方法,我已经有了。我正在寻找使用css动画或翻译的方法。