親のメソッド実装を呼び出す

親のメソッド実装を呼び出すproxyFunc.applyをパラメータとして渡しますこれと変更された引数の配列引数。その時、関数proxyFunc変数に関連付けられたときに、この、正しいオブジェクトのインスタンスを参照されて参照されて実行されます。適用を使用して、非常に便利ですし、プロキシメソッドの実装を簡素化します。欠点は、元のメソッドは、プロキシメソッドにも適用する必要がありますが渡されます。場合は、プロキシ関数を適用する使用しないように、元のメソッドを呼び出すと、その後のエラーが生成される場合があります。

  

際には、生成されたコードが正しく動作する実行されます。課題は、コードの生成にある。 1つのアプローチでは、プロキシのメソッドの完全な実装を表すテキストのバッファを生成することです。別のアプローチを動的に生成し、生成されたコードの一部を評価し、他の部分のための動的な関数を使用しています。これらの各ソリューション、および最良の解決策は問題がJavaScriptがジェネリック医薬品を使用することです。 JavaScriptのジェネリック医薬品を使用すると、目的のコードを定義することができますランタイムは、行動面で拡大することができます。次のコードの完全なプロキシの次世代ソリューションです。

 ソース: /サイト/ルート/スクリプト/ jaxson / common.jsプロキシ:(例えば、funcIdentifier、newFunc)(場合に(!インスタンス[funcIdentifier])(スロー新しいError関数("メソッドは、このオブジェクト上で("+ funcIdentifier +"が存在しない)");)ヴァールproxyPrototype =関数()(ヴァールorigFunc = __orig;ヴァールproxyFunc = __proxy;ヴァール引数=新しいArray();(ヴァールc1 = 0; c1"のarguments.length; c1 + +)(argsに。 (引数[0プッシュ]);)args.push()origFunc;(引数)args.push; proxyFunc.apply(これは、args)を返す;)インスタンス[funcIdentifier] = Generics.expand(proxyPrototype、(__orig:インスタンス[ funcIdentifier]、__proxy:newFunc));)

プロキシの実装は、それほど説明のためのコードは既に主に説明されている必要はありません。 proxyPrototype変数の定義を見て、あなたには、記事全体を通して説明されて理想的な生成されたコードの類似性を通知してください。 proxyPrototypeと理想的なコードとの唯一の違いはorigFuncとproxyFunc定義されていないための値です。

origFuncとproxyFunc変数__origと__proxy変数の値は、割り当てられているの識別子は、JavaScriptのジェネリック医薬品拡大に使用されます。 Generics.expandへの呼び出しは、理想的なバッファのように、バッファを展開します。パラメータは、プロキシメソッドにインスタンスは、プロキシのメソッドの実装を生成するためには、オブジェクトのインスタンスを表している。funcIdentifierは、プロキシには、メソッドの文字列バッファを表します。とnewFuncこれは、元の前に呼び出されるプロキシ機能を表しています。

プロキシのメソッドとしては、次の例に示すように使用することができます。 ソース: /サイト/ルート/ Ajaxの記事/ジャバスクリプト/ proxy.html automated_proxy:関数()(ヴァール分類=新しいDefinedClass();("automated_proxy(cls.defined |前)"、cls.defined.toString情報をもっと見る());協。プロキシ(分類、""、(tstValue、toCall、args)を(情報("proxyfunction"、"パラメータ("+ tstValue +")関数が定義されてカウント引数を受け取った("+のarguments.length +")、元の引数カウント(" + args.length + ")"); toCall.apply(これは、引数);));("automated_proxy情報をもっと見る(cls.defined |後)"、cls.defined.toString()); cls.value = 10; cls.defined(10);)

実装では、DefinedClass型のインスタンス化され分類変数に割り当てられます。画像の目的については、cls.definedの実装(情報(..., cls.defined.toString))は、元のメソッドの実装が何であるかを見るには生成されます。呼び出しops.proxyし、最初の2つ3つのパラメータがあります。パラメータ(分類と""で定義)は明白です。 3番目のパラメータは、プロキシメソッドであり、この例の場合には、インライン関数が定義されます。 3番目のパラメータは、インラインメソッドをする必要があるわけではなく、関数の参照、または、別のクラスのインスタンスをすることができます後ops.proxyへの呼び出しは、info関数にcls.defined法の修正版を説明するための別の呼び出しです。

ヒント は、サンプルからは、テストコードを実行する方法のコードを作品を見てあなた自身の理解をテストする。は、定義されたメソッドを呼び出すコードの最後の行には、プロキシメソッドは、元のメソッドの前にするときは、メソッドのプロキシのパターンを実装するには、次の点に留意しておくと呼ばれる:を示しています

する前に、メソッド•Proxyパターンをフィルタ処理する前処理する場合に適用され、後処理パラメータ(ある場合)は、メソッドに渡されます。

プロキシのメソッドの実装•元のメソッドを呼び出すための責任がある。

メソッド•Proxyパターン最高の関数内で関数を埋め込むことによって実装されます。埋め込まれたアプローチを使用する利点は、関数は他のオブジェクトのインスタンスが破損するメソッドの実装をせずに参照することができます。

メソッドを複数回埋め込むことができます•Proxyパターン。

記事は、ソニアLandeを提出


免責事項:弊社のウェブサイトは、この資料の内容については責任を負いません。 Webarticles無料の情報リソースです。
重要: この記事は、"親のメソッドの実装を呼び出し、"自動ソフトウェアによって翻訳された。大変申し訳ございませんが発生した可能性があります任意のスペルミスを感じている。お客様のご理解いただき、ありがとうございます。


Online: 338 users browsing the articles directory