Javascript デザインパターン プロトタイプ モードの詳細

Javascript デザインパターン プロトタイプ モードの詳細

1. プロトタイプモード

プロトタイプ パターンは、オブジェクトの作成時にオブジェクト プロトタイプのプロパティとメソッドを共有することで、パフォーマンスを向上させ、メモリ使用量を削減し、コードを再利用するために使用されます。

例1

関数 Person(名前) {
  this.name = 名前;

  この.config = {
    a: "1",
    b: "2",
  };

  this.hello = 関数(){
    console.info("こんにちは");
  };
}

上記のコードを使用して 100 個のインスタンスを作成する必要がある場合は、 100 個のconfigと 100 個のhelloを作成する必要がありますが、これら 2 つは各インスタンスでまったく同じです。

そのため、共通コードを抽出することでオイルの最適化を行うことができます。

定数設定 = {
  a: "1",
  b: "2",
};
const hello = 関数() {
  console.info("こんにちは");
};
関数 Person(名前) {
  this.name = 名前;

  this.config = 設定;

  this.hello = こんにちは
}

この方法では、Person オブジェクトがいくつ作成されても、1 つのconfigと 1 つのhelloのみを作成する必要があります。 しかし、グローバル変数が汚染されたり、誤ってconfigが変更されたり、 Person他のコードと高度に結合したり、コードの拡張やメンテナンスが困難になったりするなどの問題がまだ残っています。

したがって、プロトタイピングを通じて最適化を行うことができます。

関数 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");

要約:

js はメモリを多く消費し、オブジェクトの作成に時間がかかります。内部属性の作成を減らすことで、メモリ使用量を削減できます。

プロトタイプ モードでは、 javascript言語のプロトタイプ機能を使用して同じプロパティを共有し、メモリ使用量を削減してオブジェクト作成の効率を向上させます。

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");

実行結果は次のとおりです。

モジュール A は食品メッセージを受信します。

食事が来ました

モジュール B は食品メッセージを受信します。

食事が来ました

モジュール A は食品メッセージを受信します。

食事がまた来る

要約:

一般的に、js コンポーネント モジュールが通信する方法は 3 つあります (直接通信、親コンポーネントを介した通信、イベント モジュールを介した通信)。オブザーバー パターンは、モジュールとコンポーネント間の通信に使用されます。イベント サブスクリプションとイベント パブリッシュの統一されたパターンを提供することで、モジュールとコンポーネントを分離し、コードの保守性を向上させます。

これで、Javascript デザイン パターンのプロトタイプ パターンに関する詳細な記事は終了です。Javascript プロトタイプ パターンに関するより関連性の高いコンテンツについては、123WORDPRESS.COM の以前の記事を検索するか、次の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM を応援していただければ幸いです。

以下もご興味があるかもしれません:
  • JavaScriptプロトタイプと例の詳細な説明
  • JavaScript プロトタイプチェーンを理解するための 2 つの図
  • JavaScript プロトタイプの詳細
  • JavaScriptプロトタイプチェーンの詳細な説明
  • JavaScript プロトタイプとプロトタイプチェーンの詳細
  • JavaScript プロトタイプとは何かご存知ですか?

<<:  Docker Hubの動作原理と実装プロセスの分析

>>:  Navicat Premium が MySQL 8.0 に接続してエラー「1251」を報告する問題を解決する方法の分析

推薦する

vue-admin-template 動的ルーティング実装例

ログインを提供し、ユーザー情報データインターフェースを取得するapi/user.js内 '@...

Windows DNS サーバーに「ワームレベル」の脆弱性が露呈、17 年間存在

脆弱性の紹介SigRed の脆弱性はワーム化可能であるため非常に危険です。つまり、ユーザーの介入なし...

HTML でのアンカーポイントの使用_PowerNode Java アカデミー

ここで、アンカー ポイントを制御するいくつかの状況をまとめてみましょう。 1. 同じページ <...

クールなページング効果を実現するネイティブJS

この記事では、次のような効果を持つ JS ページング効果の例を紹介します。クールだと思いませんか? ...

HTML と CSS に関する基本的なメモ (フロントエンドでは必読)

HTMLに触れた当初はレイアウトにいつもテーブルを使っていましたが、とても面倒で見た目も悪かったの...

Reactはルーティングを使用してログインインターフェースにリダイレクトします

前回の記事では、webpack と react 環境を設定した後、ログイン インターフェースとその後...

JavaScript で localStorage を使用する方法

.NET の世界に参入したい開発者であれば、何が可能なのかを知る必要があります。 .NET Fram...

Node.js でメモリ効率の高いアプリケーションを作成する方法

目次序文問題: 大きなファイルのコピーNodeJS のストリームとバッファバッファストリーム解決策 ...

Dockerとiptablesとブリッジモードのネットワーク分離と通信操作の実装

Docker は、ブリッジ、ホスト、オーバーレイなどの複数のネットワークを提供します。同じ Dock...

WeChatミニプログラムはuni-appを通じて世界中に共有されます

実際の使用では、ミニプログラムを友人や友人サークルと共有する必要があることが多く、通常は一度に 1 ...

JavaScript ベースで年・月・日の 3 階層連携を実現

この記事では、年、月、日の3段階のリンクを実現するためのJavaScriptの具体的なコードを参考ま...

bashコマンドの使い方の詳細な説明

Linux では、基本的に vi エディタのように「.sh」拡張子を持つテキストの処理と実行を記述す...

nginx httpモジュールのデータ保存構造の概要

このセクションから、http モジュールの実装原理について説明します。http モジュールで非常に重...

17の広告効果測定の解釈

1. 広告の 85% は未読です<br />解釈: 成功する広告の 15% にどうやって...

Linux パーティションまたは論理ボリュームにファイルシステムを作成する方法

序文システムにファイル システムを作成し、それを永続的または非永続的にマウントする方法を学習します。...