2013-03-05 58 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

相關問題