2013-03-05 13 views
6

せずに、オブジェクトのメソッドの連鎖を止めるだから、私たちはいくつかのfoo.bar().bar().bar().bar();チェーンを行うことができます。JS - 私たちはいくつかのFooオブジェクトに</p> <pre><code>var Foo = function() { this.bar = function(bazinga) { if (bazinga) {return this;} else {return false;} } this.show = function() { alert('bar'); } }; </code></pre> <p>を持ってエラー

しかし、チェーンの途中でbar()がfalseを返した場合、次のbar()の試行でエラーが発生します。undefined has no method bar() whitch is of thing。

したがって、すべてのチェーンがエラーなしでfalseを返すようにするには、どのような 'rings'もfalseを返しますか?

FIDDLE

答えて

3

あなたはバーの戻り値の型を変更する必要があります。私はその目的のためにnullオブジェクトの並べ替えを作成し、nullオブジェクトについてfalseを返すチェーンの最後にファイナライズメソッドを追加することをお勧め:私はfinalizeメソッドを使用しなかったあなたのフィドル例えば

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

が、ヌルオブジェクトにshowメソッドを与えました。そうしないとあなたはまだ終わりでfalse.show()を持っているでしょう:

Fiddle

+1

1を参照してください、それはそう呼ばれている 'ヌルオブジェクトPattern' - それを使用する方法の良い例! – mkk

+0

はい、ここから私の言葉を得ました。参考:http://c2.com/cgi/wiki?NullObject –

+0

私はそれを得ました。しかし、クラスがより大きくなると、それが厄介にならないかどうか心配です。 – OPOPO

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

暗黙の依存関係は、

今あなたが書いた関数は今に結合されている文字列

配列、オブジェクト1、TagWrapper、タグありこれらすべてのオブジェクトとこれらの変更は、潜在的にあなたのコードを混乱させる可能性があります。

我々は

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

でのみStringオブジェクトを持つすべての取引を見ているかのように。詳細情報については

Law of Demeter

+0

私はそれをやっているjavascriptやjQueryの方法を探していません、私はすでにそれを持っています。私はCSSアニメーションや翻訳を使用してこれを行う方法を探しています。 –

関連する問題

 関連する問題