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」を報告する問題を解決する方法の分析

推薦する

MySQL で最大接続数を設定するためのヒントのまとめ

方法1: コマンドラインの変更次の図に示すように、MySQL コンソールを開いて「set GLOBA...

Ubuntu インストール cuda10.1 ドライバ実装手順

1. cuda10.1をダウンロードします。 NVIDIA 公式ウェブサイト リンク: https:...

MySQL ページングクエリ最適化テクニック

ページング クエリを使用するアプリケーションでは、LIMIT と OFFSET を含むクエリが非常に...

JavaScript 型検出方法の例のチュートリアル

序文JavaScriptはWebフロントエンドで広く使われている言語の一つであり、Webアプリケーシ...

Jenkins統合Dockerプラグインの問題を解決するいくつかの方法

目次背景質問1エラー 2エラー 3エラー4要約する背景テスト環境では、docker プラグインを統合...

JavaScript でよく使われる 5 つのオブジェクト

目次1. JavaScript オブジェクト1).配列オブジェクト2).ブールオブジェクト3).日付...

Vuexはセッションストレージデータを結合して、ページを更新するときにデータが失われる問題を解決します

目次序文1. 理由: 2. 解決策のアイデア: 1. ローカル保存方法: 2. 実装手順: 3. 最...

JavaScript で支払いの 10 秒カウントダウンを実現

この記事では、支払いの10秒カウントダウンを実現するためのJavaScriptの具体的なコードを参考...

MySql の 4 つのトランザクション分離レベルについて簡単に説明します。

分離レベル:隔離はあなたが考えるよりも複雑です。 SQL 標準では 4 つの分離レベルが定義されてお...

MySQL SQL 最適化チュートリアル: IN クエリと RANGE クエリ

まず、in() クエリについて説明します。 「High Performance MySQL」では、イ...

Ajax jQueryはページ上のdivの更新効果を実現します

元のコードは次のとおりです。 <div class='コントロールグループ'&...

MySQLからデータをインポートする際の不正なフォーマット、インポートの遅延、データ損失などの問題を迅速に解決します。

遅い問題を完全に解決したい場合は、MySQL を MySQL 8.0 にアップグレードすることをお勧...

CSS3 シンプルカットカルーセル画像実装コード

実装のアイデアまず、親コンテナーを作成し、2 つの順序なしリストを使用して、柔軟なレイアウトで親コン...

vue v-for ループ オブジェクトの属性

目次1. ループオブジェクト内の値2. ループオブジェクト3. キーと値のループ1. ループオブジェ...

LinkedIn がウェブサイト閲覧を簡素化するためにリニューアル

ビジネス ソーシャル ネットワーキング サイト LinkedIn は最近、ナビゲーション バーとユー...