プロキシのメソッドの実装問題は、プロキシメソッドを実装するための効果的な戦略を選択します。理論Proxyパターンインターフェイスの実装として定義されているパスとして機能を通じて、実際の実装です。インターフェイスのインスタンスのすべてのユーザーは、特定のメソッドを呼び出して再ルーティングされて実現されません。 Proxyパターンの完全な実装は、この資料の焦点ではないのではなく、この資料では、1つのメソッドのためのProxyパターンを適用することに焦点を当て。配線の代替方法では一緒に2つのメソッドは、defined2メソッドは、クラスのインスタンスに関連付けられて配線されて最初にして、新しいメソッドを呼び出して、元のメソッドを呼び出します。配線は、このフォームでは、あなたが委任モデルを作成しているプロキシのパターンを実装されていません。プロキシおよびデリゲートのモデル間の主な違いは、プロキシモデルでは、元の実装を呼び出すと、デリゲートモデルには制限がない場合の責任です。ソリューションがこれらの2つのモデルと何を達成したいとの間の違いを知って、のソースコードがどうあるべきかを検討し、一般的な方法には、ソースを変換することができます。次のクラス宣言を考えてみましょう。 ソース: /サイト/ルート/ Ajaxの記事/ジャバスクリプト/ proxy.html関数DefinedClass()())を引数カウント=関数(tstvalue)(情報("DefinedClass.defined"、"パラメータ("+ tstvalue +"DefinedClass.prototype.defined( "+のarguments.length + ")"); DefinedClass.prototype.defined.value = 10; assertEquals(tstvalue、this.value);)DefinedClassクラスが定義されており、定義され、単一のメソッドがあります。メソッドレベルのプロキシのパターンが定義されて適用されます。は、元のメソッドが定義される前に呼び出されているプロキシメソッドを次のとおりです。 ソース: /サイト/ルート/ Ajaxの記事/ジャバスクリプト/ proxy.htmlヴァールproxyfunc =関数(tstValue、toCall、args)を(情報("proxyfunction"、"パラメータ("+ tstValue +")数引数を受け取った("+のarguments.length + ")、元の引数カウント("+ args.length + ")"); toCall.apply(これは、引数);)
移動するため、現在のメソッドの実装(定義されたプロキシを実装する課題)を持つことができます。 Proxyパターンの実装ごとに、関数はproxyfunc変数によって参照される現在のメソッドを実装する前に呼び出されるようにしています。次のように明白な解決策は、proxyfunc変数を参照するように定義されたメソッドを割り当てるには:DefinedClass.prototype.defined = proxyfuncこのソリューションは、ため、元のメソッドproxyfuncによって参照されていない突飛だ。元のメソッドが無くなってしまったと思われるときにproxyfuncしようとすると、元のメソッドを呼び出していない場合、エラーが発生します。元のメソッドの規則は、メソッドの実装の別のプロパティによって参照され従うことができる: DefinedClass.prototype.originalDefined = DefinedClass.prototype.defined; DefinedClass.prototype.defined = proxyfunc これは、元の実装規約を使って呼び出すための責任があるproxyfunc、その元のメソッドoriginalDefinedプロパティに格納されて知っているのでこれはOKだ実際には別の問題です。どのような場合、プロキシのメソッドのプロキシのメソッドがありますか?以来、originalDefinedメソッドがすでに定義されて、上書きを行うと、元のメソッドを失うということですか?もう1つのソリューションは、次のように規則を拡張することです: DefinedClass.prototype.originalOriginalDefined = DefinedClass.prototype.originalDefined; DefinedClass.prototype.originalDefined = DefinedClass.prototype.defined; DefinedClass.prototype.defined = proxyfunc このソリューションの欠点は、大会ごとの識別子を元の識別子の数が含まれます。規則では、特定のプロキシメソッドは、特定の場所に配置する必要がありますそれ以外の場合、プロキシのメソッドかどうかをoriginalDefinedを呼び出すか、orginalOriginalDefinedを知っていません。もう一つの問題は、どうすればoriginalDefinedされている実際のメソッドが参照?ソリューションは、プロキシメソッドを記事には新しいプロパティを作成する組み込み関数を作成していません。埋め込み機能をそれは外部からアクセスされていない関数を宣言することが可能となるプロキシメソッドをプロキシのメソッド内に埋め込むことができます。生成されるJavaScript次のとおり: DefinedClass.prototype.defined =関数()(ヴァールorigFunc =関数(tstvalue)(情報("DefinedClass.defined"、"パラメータ("+ tstvalue +")引数の数("+のarguments.length + ")"); assertEquals (tstvalue、this.value);)ヴァールproxyFunc =関数(tstValue、toCall、args)を(情報("proxyfunction"、"パラメータ("+ tstValue +")数引数("+のarguments.length +")、元の引数を受け取ったカウント("+ args.length + ")"); toCall.apply(これは、引数);)ヴァール引数=新しいArray();(ヴァールc1 = 0; c1"のarguments.length; c1 + +)(argsに]);)args.push()origFunc(引数[c1押してください。;(引数)args.push;(これは、args)をproxyFunc.apply;)
2つの変数origFuncとproxyFunc、参照機能します。 origFunc変数は、定義されたメソッドの元の実装を表します。 proxyFunc変数は、元のメソッドが呼び出される前は、プロキシメソッドを表します。両方の関数は、関数内では、プロキシメソッドを呼び出すための責任が埋め込まれている。 関数内の関数の埋め込みは、元の関数が呼び出されますを知って、プロキシメソッドを必要としません。組み込みの各インスタンスについては、プロキシのメソッドとは、元のメソッドです。コンベンションされているが埋め込まれ、2つの方法を人と人の呼び出しのパラメータの周辺で渡されるのを追跡する方法。 親メソッドの役割は、組み込みのメソッドの参照を管理するために、このインスタンスを管理し、パラメータを管理することです。親のメソッドをArray型のように引数を考慮してパラメータを管理します。 JavaScriptの引数を定義されたオブジェクトの引数の配列です。は、プロキシメソッド関数を呼び出して、能力の引数は、元のオブジェクトのインスタンスに基づいて変更する必要があります知っている親のメソッドは、引数の新しいセットを作成します。引数には、引数を含む配列を作成する目的は、プロキシのメソッドは、常に最後のパラメータは、メソッドとして呼び出すと引数があります宣言に関連します。関数内で関数の埋め込みに問題があります:あなたを割り当てる方法を行う組み込み関数では、この参照? JavaScriptは、これは関数オブジェクトが関連付けられているメソッドは、適用を提供することによってこの問題を解決します。 記事は、ソニアLandeを提出 免責事項:弊社のウェブサイトは、この資料の内容については責任を負いません。 Webarticles無料の情報リソースです。 重要: この記事は、""プロキシのメソッドの実装の自動ソフトウェアによって翻訳された。大変申し訳ございませんが発生した可能性があります任意のスペルミスを感じている。お客様のご理解いただき、ありがとうございます。
|
|||||
| Online: 275 users browsing the articles directory |
|
|