6

いくつかの 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 を返すようにするには、その「リング」のいずれかが false を返すようにするにはどうすればよいでしょうか?

フィドル

4

3 に答える 3

3

バーの戻り値の型を変更する必要があります。その目的のために一種の null オブジェクトを作成し、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()と、最後に次のようになります。

フィドル

于 2013-03-05T09:52:48.807 に答える
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;
    }
};
于 2013-03-05T09:53:50.143 に答える
0

メソッドチェーンは少し危険です。それはすべて依存関係に関係しています。

メソッド チェーンを使用する場合は、チェーンの各部分が返すオブジェクトに注意することをお勧めします。

それらがすべて同じでない場合 (たとえば、すべてが文字列ではない場合)、チェーンを別々のステートメントに分割することをお勧めします。または、それらを別の関数に抽出することもできます。

次のようなチェーンがあるとしましょう

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

チェーンの暗黙的な依存関係は、Array、Object1、TagWrapper、Tag、String です。

これで、作成した関数がこれらすべてのオブジェクトに結合され、これらを変更すると、コードが混乱する可能性があります。

どこを見ているかのように

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

すべて String オブジェクトのみを扱います。

詳細については、デメテルの法則を参照してください。

于 2013-03-05T13:13:08.870 に答える