1. プロトタイプモードプロトタイプ パターンは、オブジェクトの作成時にオブジェクト プロトタイプのプロパティとメソッドを共有することで、パフォーマンスを向上させ、メモリ使用量を削減し、コードを再利用するために使用されます。 例1関数 Person(名前) { this.name = 名前; この.config = { a: "1", b: "2", }; this.hello = 関数(){ console.info("こんにちは"); }; } 上記のコードを使用して 100 個のインスタンスを作成する必要がある場合は、 100 個の そのため、共通コードを抽出することでオイルの最適化を行うことができます。 定数設定 = { a: "1", b: "2", }; const hello = 関数() { console.info("こんにちは"); }; 関数 Person(名前) { this.name = 名前; this.config = 設定; this.hello = こんにちは } この方法では、Person オブジェクトがいくつ作成されても、1 つの したがって、プロトタイピングを通じて最適化を行うことができます。 関数 Person() {} var p = new Person(); インスタンスを作成するときのこの関数のプロトタイプ図は次のとおりです。 例2関数 Person(名前) { this.name = 名前; この.config = { a: "1", b: "2", }; this.hello = 関数(){ console.info("こんにちは"); }; } // このメソッドはプロトタイプを書き換え、コンストラクターが失われて Object() になります。 //Person.prototype.xx=yy を使って記述するか、Person.prototype.constructor=Person を再指定することができます。 Person.プロトタイプ = { バージョン: 1.0, 言う: 関数 (arg) { console.info(`${this.name} は ${arg} と言います`); }, コンストラクタ: Person, }; var p1 = 新しい Person("p1"); var p2 = 新しい Person("p2"); console.info(p1.config == p2.config); // 偽 console.info(p1.hello == p2.hello); // 偽 console.info(p1.say === p2.say); //true p1.say("qq"); p2.say("qq"); console.info(p1.version === p2.version); //true コンソール.info(p1.バージョン); インスタンスを作成するときのこの関数のプロトタイプ図は次のとおりです。 例3関数 Person(名前) { this.name = 名前; この.config = { a: "1", b: "2", }; this.hello = 関数(){ console.info("こんにちは"); }; } //このメソッドはプロトタイプを書き換え、コンストラクタが失われて Object() になります Person.プロトタイプ = { バージョン: 1.0, 言う: 関数 (arg) { console.info(`${this.name} は ${arg} と言います`); }, }; 関数 PersonA(名前) { Person.call(これ、名前); } PersonA のプロトタイプ = Person.プロトタイプ; 関数 PersonB(名前) { Person.call(これ、名前); } PersonB のプロトタイプ = Person.プロトタイプ; var pA = new PersonA("pa"); var pB = new PersonB("pb"); console.info(pA.config == pB.config); // 内部プロパティの比較が誤っています console.info(pA.hello == pB.hello); // 内部プロパティの比較が誤っています console.info(pA.say === pB.say); // プロトタイプ メソッドの共有が誤っています pA.say("qq"); pB.say("qq"); console.info(pA.version === pB.version); // 真のプロトタイププロパティの共有 console.info(pA.version); // 1.0 Person.prototype.version = 2.0; //プロトタイプの共有プロパティを変更する console.info(pB.version); //2.0 console.info(新しいPerson().バージョン); //2.0 //プロトタイプ共有メソッドを変更する PersonB.prototype.say = function (arg) { console.info(`v2--- ${this.name} は ${arg} と言います`); }; pB.say("qq"); 新しい Person("Person").say("ww"); 要約:
2. オブザーバーパターン
モジュールとコンポーネント間の通信方法 モジュールとコンポーネント間で直接参照通信が使用される 定数モジュールA = { 言う: 関数 (メッセージ) { console.info("A は " + msg と言います); }, letBrun: 関数() { //モジュールBを直接参照 モジュールBを実行します。 }, }; 定数モジュールB = { 実行: 関数 () { console.info("B 実行 "); }, letAsay: 関数() { // moduleAを直接参照する moduleA.say("hello"); }, }; moduleA.letBrun(); //B 実行 moduleB.letAsay(); //Aが挨拶する 親コンポーネント通信はモジュールとコンポーネント間で使用されます 定数モジュールA = { 言う: 関数 (メッセージ) { console.info("A は " + msg と言います); }, }; 定数モジュールB = { 実行: 関数 () { console.info("B 実行 "); }, }; const 親モジュール = { モジュールA、 モジュールB、 letBrun: 関数() { this.moduleB.run(); }, letAsay: 関数() { this.moduleA.say("hello"); }, }; parentModule.letBrun(); //B 実行 parentModule.letAsay(); //A がこんにちはと言う イベントモジュールが通信を実現 関数エミッター() { イベントを次のように記述します。 this.res_oldアクション = {} this.res_action_events = {} } //リソースをサブスクライブEmitter.prototype.subscribe = function (res, action, fn) { if(!this.res_oldAction[res.name]){ this.res_oldAction[res.name] = res[アクション] res[アクション] = (データ) => { this.res_oldAction[res.name](データ) const fns = this.res_action_events[res.name].action; (i = 0 とします; i < fns.length; i++) { fns[i](データ); } } } if(!this.res_action_events[res.name]){ this.res_action_events[res.name] = {} } if(!this.res_action_events[res.name][action]){ this.res_action_events[res.name][アクション] = [] } this.res_action_events[res.name].action.push(fn) } //購読解除 resourcesEmitter.prototype.unsubscribe = function (res, action, fn) { const fns = this.res_action_events[res.name].action; (i = 0 とします; i < fns.length; i++) { もし(fns[i] === fn) { fns.splice(i, 1); 私 - ; } } } Emitter.prototype.on = 関数 (名前、関数) { if (!this.events[名前]) { this.events[名前] = []; } this.events[名前].push(fn); }; Emitter.prototype.remove = 関数 (名前、関数) { if (!this.events[名前]) { 戻る; } const fns = this.events[名前]; (i = 0 とします; i < fns.length; i++) { もし(fns[i] === fn) { fns.splice(i, 1); 私 - ; } } }; Emitter.prototype.fire = 関数 (名前、データ) { if (!this.events[名前]) { 戻る; } const fns = this.events[名前]; (i = 0 とします; i < fns.length; i++) { fns[i](データ); } }; const エミッター = 新しい Emitter(); //モジュールAにイベントを登録する const methodA = (data) => { console.info("モジュールAが食品メッセージを受信しました:"); console.info(データ); }; エミッターをオン("食べ物", メソッドA); //モジュールBにイベントを登録する const methodB = (data) => { console.info("モジュール B は food メッセージを受信します:"); console.info(データ); }; エミッターをオン("食べ物", メソッドB); //モジュール C でイベントをトリガーする emitting diode.fire("food", "Rice is coming"); //モジュール B からイベントを削除します。emitter.remove("food", methodB); //モジュール C でイベントを再度トリガーします。emitter.fire("food", "Rice is here again"); 実行結果は次のとおりです。
要約:
これで、Javascript デザイン パターンのプロトタイプ パターンに関する詳細な記事は終了です。Javascript プロトタイプ パターンに関するより関連性の高いコンテンツについては、123WORDPRESS.COM の以前の記事を検索するか、次の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM を応援していただければ幸いです。 以下もご興味があるかもしれません:
|
>>: Navicat Premium が MySQL 8.0 に接続してエラー「1251」を報告する問題を解決する方法の分析
ログインを提供し、ユーザー情報データインターフェースを取得するapi/user.js内 '@...
脆弱性の紹介SigRed の脆弱性はワーム化可能であるため非常に危険です。つまり、ユーザーの介入なし...
ここで、アンカー ポイントを制御するいくつかの状況をまとめてみましょう。 1. 同じページ <...
この記事では、次のような効果を持つ JS ページング効果の例を紹介します。クールだと思いませんか? ...
HTMLに触れた当初はレイアウトにいつもテーブルを使っていましたが、とても面倒で見た目も悪かったの...
前回の記事では、webpack と react 環境を設定した後、ログイン インターフェースとその後...
.NET の世界に参入したい開発者であれば、何が可能なのかを知る必要があります。 .NET Fram...
目次序文問題: 大きなファイルのコピーNodeJS のストリームとバッファバッファストリーム解決策 ...
Docker は、ブリッジ、ホスト、オーバーレイなどの複数のネットワークを提供します。同じ Dock...
実際の使用では、ミニプログラムを友人や友人サークルと共有する必要があることが多く、通常は一度に 1 ...
この記事では、年、月、日の3段階のリンクを実現するためのJavaScriptの具体的なコードを参考ま...
Linux では、基本的に vi エディタのように「.sh」拡張子を持つテキストの処理と実行を記述す...
このセクションから、http モジュールの実装原理について説明します。http モジュールで非常に重...
1. 広告の 85% は未読です<br />解釈: 成功する広告の 15% にどうやって...
序文システムにファイル システムを作成し、それを永続的または非永続的にマウントする方法を学習します。...