18

だから...JavaScriptをいじって、私にとっては新しいアイデアをいじって、オブジェクトのメソッドに、それらがメソッドであるオブジェクトを返すようにします。これにより、連鎖性が高まります。それでは、私の質問です。これはどのように役立つのでしょうか。基本的な動作をテストするために、これを一緒に投げました。

<script>
MathChain = function()
 {
    this.pass = function()
     {
        this.multiply = eval(arguments.join('*'));
        this.add = eval(arguments.join('+'));
        return this;
     }
 }

m = new MathChain().pass(5, 10, 20).multiply; // 1000
a = new MathChain().pass(5, 10, 20).add;      // 35
</script>

これは明らかに、この概念を使用する非常に効率的なインスタンスではないので、(jQueryを除いて)適切に実行するものを教えていただけますか?

4

9 に答える 9

25

これはあまり現実的な適用例ではありませんが、おわかりいただけると思います。オブジェクトに対してさまざまな操作を行うことができ、便利です。

var truck = function() {

    this.turnLeft = function {

       // turn left
       return this;

    }

    this.turnRight = function {

       // turn right
       return this;

    }

    this.goReallyFast = function {

       // go fast!
       return this;

    }

};

// My get-away plan
var myTruck = new truck();
myTruck.turnLeft().turnRight().goReallyFast();
于 2009-03-02T18:57:03.437 に答える
8

流暢なインターフェース - http://en.wikipedia.org/wiki/Fluent_interface

ええ、それは非常に便利だと思いますが、他のデザインパターンと同様に、必要な場合にのみ使用する必要があります

編集: これは流暢なインターフェースを使用した c# の Twitter クライアント API です - http://code.google.com/p/tweetsharp/

于 2009-03-02T19:00:02.417 に答える
8

非常に異なる (オブジェクト指向ではない) 例として、チェーンはUnix のパイプラインにいくらか似ています。Unix パイプの各ステップは、次のステップに進むのに適した完全な (変更された) コンテンツを返します。

cat file1 file2 | sort -n | awk '{print $2}' | sed 's/@/ at /g'
于 2009-03-02T19:05:36.553 に答える
6

これが役立つ例の 1 つは、問題を少し変えた場合です。同じオブジェクトを返すのではなく、オブジェクトをimmutableになるように設計します。次に、関数はすべて同じ型の新しいインスタンスを返しますが、プロパティは既に適切に設定されています。

これには、特に関数型プログラミングの分野で、多くの実用的なアプリケーションがあります。

于 2009-03-02T19:06:52.527 に答える
3

あなたの例と同じようには機能しませんが(TBH、以前にそのように行われたことはありません)、jqueryは「チェーン」が非常に便利であると考えており、最近ではjqueryがほとんどの基準になっていますJS Web フレームワーク... そうそう :-)

于 2009-03-02T19:42:08.523 に答える
3

メソッドが定義された後、メソッドを連鎖可能にするための一般的な解決策を探しているときに、この質問を見つけました。これが私が思いついたものです。私は JavaScript 初心者です。バイヤーは注意してください。

makeChainable = function() {
    var receiver = arguments[0]
    for (var i = 1; i < arguments.length; i++) {
        functionName = arguments[i];
        (function() {
            wrapped = receiver[functionName];
            receiver[functionName] = function() {
                wrapped.apply(receiver, arguments);
                return receiver;
            }
        })();
    }
}

daisy = {
    name: 'Daisy',
    moo:  function() { console.log(this.name + " moos!") }
}

makeChainable(daisy, 'moo');
daisy.moo().moo().moo();
于 2013-04-03T20:39:52.223 に答える
1

JavaScript では、これは DOM をナビゲートするときに常に発生します。特に、ID を持たない要素の束を通り抜けようとするとき。

たとえば、テーブルの最初の要素の検索に関する SO に関する質問がありました。多くのループや連鎖コマンドが含まれる場合があります。

于 2009-03-02T19:16:34.607 に答える
0

JavaScript チェーンは、単一のオブジェクトに対して一連のアクションを実行する場合に非常に役立ちます。以下のMichael Lutonに同意します。チェーンは注意して処理する必要があります。まだ読み取り可能なオブジェクトに 1 つまたは 2 つの連鎖メソッドを追加する場合。4 つ、5 つ、または 9 つも追加し始めると、コードを読むだけでなく、維持することも難しくなります。

于 2009-07-08T18:35:46.243 に答える
-2

すべての子供たちはチェーンが大好きです。ただし、私の経験では、コードの可読性が低下する可能性があるため、注意して使用する必要があります。言い換えれば、あなたにとって意味のあることを行い、その概念に基本的な知識を持っている他のプログラマーが簡単に理解できる..

于 2009-04-08T00:37:10.100 に答える