デリゲートを実装する問題
どのようにあなたのコードを実行するとコードの衝突を避けるための合理化には、デリゲートのアーキテクチャを使用します。理論が、非常に多くのコードが注目を集めるための戦いがJavaScriptを記述する。コードの一例として、注目を集めるための戦いwindow.onloadイベントです。一度は、HTMLページが完全に読み込まれ、初期化window.onloadイベントが呼び出されます。ときに、ブラウザは、ブラウザのスクリプトでは、チャンスの完全なHTMLページで自身を初期化を行っているwindow.onloadを呼び出します。スクリプトの作成については、このメソッドは、非常に興味深いですが、2つのツールキットwindow.onload、さらには他のいずれかを上書きする可能性は高い使用している。次のコードを1つのツールキット:window.onload =関数によって書かれた想像()(/ /ツールキットを初期化する1)は、ツールキットは、ときに、onloadイベントが呼び出されると、私の機能を使用すると言って、このコード例では。 2番目のツールキットは、onloadイベントに興味がある次のようにwindow.onloadを割り当てること:window.onload =関数()(/ / 2)2番目の割り当ての作業とツールキットを初期化する、それは、どのツールキットの初期に起こる疑問が湧いて1?その答えは、呼び出されていないことです。ツールキットの1と2のonloadイベントの注目を集めるため、と戦っているの勝者のいずれかのツールキットですonloadイベントの最後を割り当てます。このジレンマを解消する3つの潜在的な解決策があります: •変換ツールキットを参照するために複数のonload関数ができるようになるのブラウザ固有のタグを使用します。このソリューションの欠点は、どのコードの保守コストの増大に固有のコードを、ブラウザを記述する必要があります。 •使用して関数を呼び出すの両方の初期化。欠点は、その両方の初期化を管理する機能を提供する必要があります。 •変換ツールキットはきれいには、互いに他の初期化を上書きしないで再生します。欠点は、ツールキットは、他の初期化ルーチンを呼び出すことを理解することです。述べたように解決策は、最初のソリューションは、前のセクションで提示されたの欠点は、ブラウザ固有のことだ。これは、デリゲートのアーキテクチャを実装してMozillaをよりエレガントなソリューションです。他のブラウザでは、最初のソリューションとして、エレガントな、そしてその最終的な解決されていない2番目と3番目のソリューションの混合物です。現時点では、しかし、のどのように実装されている2番目の解決策に焦点を聞かせ次のとおり: window.onload =関数()(initializeToolkit1(); initializeToolkit2();) windows.onload関数は、ツールキットの1と2の初期化ルーチンを呼び出す機能が割り当てられます。以来、開発者を追加したり、初期化ルーチンを削除してソリューションの作品、それは、メンテナンスの問題があります。場合は、関数の実装を見て、このisn'ta主要な問題は、しかし、その2つの関数の呼び出しに1つの関数の呼び出しに変換されます。これは、デリゲートの基礎となります。 initializeToolkit1とinitializeToolkit2関数、お互いに何をすることはないが呼び出されたときは、それぞれを簡単にそれが唯一の関数は、onloadイベントに割り当てられているという考えにだまされることができます。デリゲートは、プロキシのように、デリゲートのすべての呼び出しではないプロキシのに対し、関数、関数の最初にコールされた後、呼び出された関数の他の関数を呼び出すことを期待する。実装の観点からは、デリゲートは、プロキシに非常に似て実装しています。がないため、1つのオブジェクトインスタンスのすべての参照を管理して、デリゲートのJavaScriptの実装では、伝統的な委任とは異なるありません。古典的なデリゲートの実装では、window.onload関数は、マネージ関数参照の呼び出しは、デリゲートオブジェクト構造体、コールが呼び出し。例の場合では、デリゲートオブジェクト構造initializeToolkit1とinitializeToolkit2コールを呼び出すことを意味します。JavaScriptのデリゲートの実装では、window.onloadの参照は、2つの関数の参照:func1のおよびfunc2が含まれて親のデリゲート関数。親のデリゲート関数の両方func1のおよびfunc2を呼び出します。ときに親の委任機能を一緒に、func1を(説明のために)へのリファレンスを選択する関数(initializeToolkit1)を呼び出すことおよびfunc2(再度説明のために)参照選ばれたチェーン内の次の親の委任連鎖している。次の親の代表団は、1つの関数を参照する関数(initializeFunction2)、および、他の関数の参照を別の親、デリゲート関数を呼び出します。直列化の問題を理解するには、window.onloadを使用して参照を直列化しようとすると想像する: window.onload =関数()((これは、引数);)ヴァールバッファ=(window.onload)ops.serialize delegates.invoke; これはされている例では、window.onloadの参照は、どの機能をinitializeToolkit1とinitializeToolkit2コールして、グローバル変数のメソッドは、delegates.invoke呼び出す関数をしたい場合は、window.onloadをシリアル化するHTMLページの状態を保存します。標準的な基準点。しかし、シリアライズwindow.onloadデリゲートをシリアル化されません。これには、そのときに、ページが再表示されデリゲートへの参照はシリアル化、デリゲートのインスタンスが失われることが作成。あなたは、前の段落を読むことが、私は、そのため、どのようにシリアル実行されますされていない私のビー玉を失ったと思う。代わりに、次のソリューションを実装する可能性があります: window.unload =関数()(ヴァールバッファ(代表)ops.serialize =;)` このソリューションでは、呼び出されることになり、データが生成されるデリゲートを表すストリーム関数をアンロードします。しかし、このソリューションは実際には正しいですか?私は、解決策は、デリゲートを別の場所に変数の問題を委譲して主張し、それを解決するものではありません。想像して、例えば、その場合は、ページの状態をシリアル化されます。このように要素を反復処理する場合、関連付けられている関数を生成している。だからwindow.loadシリアライズされ、window.unloadこのアプローチの大きな利点は、ときにプロトタイプを使用してコードベースは、JavaScriptを特定の言語に複数の実装では、同じ参照を共有する心配していないことです。ベースのアプローチは、1つのオブジェクトから別の関数をコピーすることができますミックスイン問題の記事は、2月15日の説明については心配しない値を使用して、今は、デリゲートの実装の背後にある理論に精通している、の技術的な詳細を見てみましょう。 ソース: /サイト/ルート/スクリプト/ jaxson / common.jsデリゲート:=関数(例えば、funcIdentifier、newFunc)(ヴァールdelegatePrototype関数()(ヴァールfunc1を= __replace1;ヴァールfunc2 = __replace2; func1.apply(これは、引数); func2場合(!インスタンス[funcIdentifier])(=関数origFunc(これは、引数);)ヴァールorigFunc;適用されます。()();)他(origFunc =インスタンス[funcIdentifier];)インスタンス[funcIdentifier] = Generics.expand(delegatePrototype 、(__replace1:origFunc、__replace2:newFunc));) ソース: /サイト/ルート/ Ajaxの記事/ジャバスクリプト/ exceptions.html window.onload =関数()(window.onerror =関数(、、ファイルの場所)(情報("window.onerror1"、"("+メッセージ+"エラーメッセージ)("+ファイルfile +")の位置("+場所+ ")");))ops.delegate(ウィンドウ、""、()(window.onerror = function関数のonload(、、ファイルの場所)(インフォメーションメッセージ("window.onerror2"、"メッセージ("+メッセージ+")("+ファイルのファイル+")の位置("+場所+ ")");))); この例では、window.onload関数は、関数が割り当てられます。ソースコードの次の行は、デリゲートに割り当てられている関数に変換するops.delegateメソッドの呼び出しを使用します。したがって、window.onloadイベントは、2つの関数と呼ばれ、どちらのwindow.onerrorを割り当てると呼ばれます。の結果デリゲートを使用するプログラマは、デリゲートを使用することがありますが、デリゲートを使用して割り当てるリソースを忘れても共有されています。したがって、優秀なプログラマーが、window.onerror割り当てられませんwindow.onerrorを割り当てると、デリゲートを使用するときは、メソッドまたは関数のコールバックを共有する必要があるコードを記述すると、デリゲートを使用することができますが、心の中で、次の点に: •代理人のプログラマは、メソッドのコールバックを共有することができますが、そのメソッドの実装内のリソースを排他的であると仮定しないでください。 •代表団が、問題は、単一のメソッド呼び出しで複数のメソッド呼び出しを行うために使用することができますを解決します。 ため、複数のメソッドが値を返す可能性があります•デリゲートの値を返すことはできませんので、参加者は、コードブロックを使用する必要があります。コードブロックは、本質的には、複数の、または結果がない指向の1つです。コードブロックを使用して何か特別なことをするときにデータが返されるためのインフラストラクチャを必要としません。 •デリゲートの参照または値アヒルの入力を使用して、それらの間の主な違いは、能力をシリアル化する中で実施することができます。 記事は、ソニアLandeを提出 免責事項:弊社のウェブサイトは、この資料の内容については責任を負いません。 Webarticles無料の情報リソースです。 重要: この記事は、""デリゲートを実装する自動ソフトウェアによって翻訳された。大変申し訳ございませんが発生した可能性があります任意のスペルミスを感じている。お客様のご理解いただき、ありがとうございます。
|
|||||
| Online: 322 users browsing the articles directory |
|
|