1

申し訳ありませんが、これを説明する方法がわかりません。例:

function OutputNumber(number) {
    this.outputThisInstead = function (otherNumber) {
        console.log(otherNumber);
    }
    console.log(number);
}

希望の使用法:


new OutputNumber(1);

コンソール出力:1


new OutputNumber(1).outputThisInstead(2);

コンソール出力:2


当然、1オブジェクトで他に何が呼び出されても、常にコンソールに書き込まれます。

私はこの特定の構文と動作を求めています-関数を初期化にアタッチします。関数が呼び出される前にオブジェクトを構築する必要があるため、不可能に感じますが、これは他の方法で達成できますか?

4

3 に答える 3

2

時間遅延 (たとえば、ブラウザ環境などsetTimeout) とフラグがあれば可能です。望ましくありませんが、可能です。

それがなければ、コンストラクターのアクションをまだ起こっていないことに基づいて行うことはできません。代わりに、コンストラクターに何かを渡して、何が起こっているかを知らせる必要があります。

ブラウザの例 (繰り返しますが、これはお勧めしません):

function OutputNumber(number) {
    var handle = 0;
    this.outputThisInstead = function (otherNumber) {
        if (handle) {
            clearTimeout(handle);
            handle = 0;
        }
        console.log(otherNumber);
    }
    handle = setTimeout(function() {
        console.log(number);
    }, 0);
}

質問に対するあなたのコメントから:

これで、私が実験している一連のオブジェクト/関数の連鎖が終わりました。例えば:

Assert.that(1).is.not(2).because('output this message if fails');

ここで、not(2) は、オプションで呼び出せるのでオブジェクトを返します。呼び出されるため、オブジェクトの動作は依存します。

チェーンの前の関数の動作をチェーンの後の関数に依存させるのではなく、おそらく.end()何かの最後に を追加します。

Assert.that(1).is.not(2).because('output this message if fails').end();

end以前の関数によって保存されたメッセージを出力します。黒魔術はいらない。.end()明らかに、これは、人々がonを置くのに失敗する可能性があるという事実に苦しんでいますが、オプションの後続の関数呼び出しに基づいて出力を変更したい場合は、出力を実行しても問題ない何らかのトリガーが必要です。

于 2012-11-17T21:44:50.933 に答える
1

outputThisInstead「静的」として宣言することは可能です:

function OutputNumber(number) {
    console.log(number);
}

OutputNumber.outputThisInstead = function (otherNumber) {
    console.log(otherNumber);
}

new OutputNumber(1); //1
OutputNumber.outputThisInstead(2); //2

ただし、演​​算子を使用してオブジェクトを作成する場合new、関数は常にnumberパラメーターをログに記録します。

関数の部分適用を使用して、必要な動作と同様の動作を実現することもできます ( here )。これはカリー化またはシェーンフィンケリングとも呼ばれます。アイデアは、関数のパラメーターを次々と埋めることができ、パラメーターの完全なセットが利用可能になったときに関数が実行されるということです。ここでカリー化の例を見ることができます。

于 2012-11-17T21:53:14.910 に答える
1

ありえない。あなたが行うまでにnew OutputNumber(1)、関数はすでに呼び出されています。チェーンされたメソッドは、その前の呼び出しにアクセスできません。

于 2012-11-17T21:47:32.880 に答える