2013-03-05 57 views
6

我们有一些Foo对象JS - 的对象的方法停止链没有错误

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()尝试会导致错误,这是错误的事情。

那么如何让所有链返回错误,没有错误,其任何'环'返回false?

FIDDLE

回答

3

你将不得不改变杆的返回类型。我建议,创造一种用于该目的空对象,并在链条的一端返回空对象错误添加定稿方法:

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

+1,就是所谓的'空对象Pattern' - 如何使用它很好的例子! – mkk 2013-03-05 09:56:31

+0

是的,那是我从那里得到的。参考:http://c2.com/cgi/wiki?NullObject – 2013-03-05 09:58:12

+0

好吧,我明白了。但我担心,如果课堂更大,它会变得棘手。 – OPOPO 2013-03-05 10:01:36

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; 
    } 
}; 
0

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

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

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

比方说你有一些连锁如

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

为链中的隐式依赖性是阵列,Object1,TagWrapper,标签,字符串

现在你写的功能现在被连接到所有这些对象以及对这些对象的任何更改都可能会破坏您的代码。

凡好像我们看

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

的所有交易都是只用String对象。

欲了解更多信息请参阅Law of Demeter

+0

我不是在寻找一个JavaScript或jQuery的方式来做到这一点,我已经有了。我正在寻找方法来使用CSS动画或翻译。 – 2015-02-28 21:57:07

相关问题