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 でメニュー権限制御を実装するためのサンプルコード

バックエンド管理システムで作業している場合、通常、メニュー権限制御に関連する問題に遭遇します。もちろ...

JavaScript を学ぶときに知っておくべき 3 つのヒント

目次1. 魔法の拡張演算子1. 配列をコピーする2. 配列を結合する3. オブジェクトを展開する2....

MySql バージョンの問題に対する完璧なソリューション sql_mode=only_full_group_by

1. sql_modeを確認する @@sql_mode を選択照会された値は次のとおりです。 ON...

Navicat で MySQL データベースのパスワードを変更する複数の方法

方法1: SET PASSWORDコマンドを使用するまずMySQLにログインします。フォーマット: ...

HTMLページ作成に関する私の経験の簡単な要約

Word of Mouth に入社して 3 ~ 4 か月が経ちました。仕事の中で一番の収穫は、ビジュ...

Dockerコンテナがホストポートにアクセスできない場合の解決策

最近、仕事中に問題が発生しました。Docker コンテナがホストの redis にアクセスできず、t...

GNU Parallelの具体的な使用法

それは何ですか? GNU Parallel は、1 台以上のコンピュータでコンピューティング タスク...

Linux の一般的な Java プログラム起動スクリプトのコード例

シェルを起動する頻度は非常に低いですが。 。 。しかし、書くたびに、多くの jar ファイル パスを...

Webスキル: 複数のIEバージョンの共存ソリューション IETester

私のおすすめ複数のIEバージョンの共存のためのソリューション以前に IE6、IE7、IE8 の共存に...

Web デザイン リファレンス Firefox デフォルト スタイル

W3C は HTML の標準をいくつか確立していますが、ブラウザは独自の定義済みスタイルに従って W...

SQLデータベースの14の事例の紹介

データシート /* Navicat SQLite データ転送 ソースサーバー: school ソース...

Linux ハードウェア構成コマンドの例

ハードウェア ビュー コマンドシステム # uname -a # カーネル/オペレーティング システ...

忘れられたMySQLパスワードとログインエラーの問題について簡単に説明します

MySQL ログイン パスワードを忘れた場合、解決方法は実はとても簡単です。MySQL メイン構成フ...

MySQL のフィールドに一意のインデックスを追加および削除する方法

1. PRIMARY KEY(主キーインデックス)を追加するmysql>ALTER TABLE...

Windows 10 での Tomcat のインストールと展開に関する詳細なチュートリアル

目次1 Java環境の設定2 tomcatのインストールと展開Tomcat をインストールして展開す...