序文今日は、デザインパターンのクリエーションパターンを見直していたところ、JS でシングルトンパターンを実装する方法がたくさんあることが分かりました。簡単にまとめ、次の 6 つの方法を皆さんと共有したいと思います。 一般的に言えば、内容は ES5 (関数) と ES6 (クラス) の実装の 2 つの部分に分かれています。 シングルトンパターンの概念シングルトン パターンは、グローバル変数であるインスタンスをシステムに保存することです。チーム開発では、異なるページ間のフォーム検証など、いくつかの類似した機能を実現するために、要件は異なる場合がありますが、名前は同じである場合があり、競合が発生します。この場合、シングルトン パターンはこの問題をうまく解決できます。
その利点について話します: 1. シングルトン パターンは名前空間を宣言します。これにより、一意のグローバル変数、つまり名前空間が生成されます。これは、オブジェクト宣言と同じ方法で宣言できます。
これはオブジェクトに少し似ていることに気付きましたか?実は、name と init はそのプロパティです。mapleTao.name を通じてその名前の値を取得し、mapleTao.init() を通じて init メソッドを呼び出すことができます。このようにして、複数の要求ページや複数人の開発を扱うときに、名前の競合の問題をうまく解決し、コードをより適切に保守および制御することができます。 2. シングルトンモードでは、グローバル状態で 1 つの変数のみを宣言します。ご存知のように、js では、function aa(){} などのメソッドを記述すると、ウィンドウに aa という変数が生成されます。関数を実装すると、コードのカプセル化で多くの関数が作成されます。このように、ウィンドウに多くの変数が作成され、より多くのメモリユニットを占有します。グローバル変数のスコープは非常に広く、多くの処理関数で変更される可能性があります。このように、バグが発生したときにすぐに見つけることは容易ではありません。ただし、シングルトンモードで作成されたオブジェクト変数を使用すると、問題をより迅速に見つけて解決できるため、問題の修復とシステムの読み込みにかかる時間が大幅に短縮されます。 3. 同じ機能を実装する場合、new によって新しいオブジェクトを作成するよりも、メモリとリソースの使用量の点で利点があります。 方法1instanceof を使用して、関数を呼び出してオブジェクトをインスタンス化するために new キーワードを使用するかどうかを決定します。 関数ユーザー() { if (!(このインスタンスのユーザー)) { 戻る } if (!User._instance) { this.name = '名前なし' User._instance = これ } User._instanceを返す } const u1 = 新しいユーザー() const u2 = 新しいユーザー() console.log(u1===u2); // 真 方法2インスタンスを生成するために関数に直接メソッド属性呼び出しを追加します 関数ユーザー(){ this.name = '名前なし' } User.getInstance = 関数(){ if(!User._instance){ User._instance = 新しいUser() } User._instanceを返す } 定数 u1 = User.getInstance() 定数 u2 = User.getInstance() コンソールログ(u1===u2); 方法3クロージャを使用した改良法2 関数ユーザー() { this.name = '名前なし' } User.getInstance = (関数() { varインスタンス 関数を返す(){ if (!インスタンス) { インスタンス = 新しいユーザー() } インスタンスを返す } })() 定数 u1 = User.getInstance() 定数 u2 = User.getInstance() コンソールにログ出力します。u1 === u2; 方法4ラッパーオブジェクトとクロージャを組み合わせて実装 const ユーザー = (関数 () { 関数_user() { this.name = 'xm' } 関数を返す(){ if (!_user.instance) { _user.instance = 新しい _user() } _user.instance を返す } })() const u1 = 新しいユーザー() const u2 = 新しいユーザー() console.log(u1 === u2); // 真 もちろん、クロージャコードは関数としてカプセル化できる。 シングルトンを頻繁に使用する場合は、この方法に似たソリューションを使用することをお勧めします。もちろん、内部実装では上記のいずれかの方法を使用できます。 関数SingleWrapper(cons) { // 非関数と矢印関数を除外する if (!(cons instanceof Function) || !cons.prototype) { throw new Error('有効なコンストラクタではありません') } varインスタンス 関数を返す(){ if (!インスタンス) { インスタンス = 新しい cons() } インスタンスを返す } } 関数ユーザー(){ this.name = 'xm' } 定数シングルユーザー = シングルラッパー(ユーザー) const u1 = 新しいシングルユーザー() const u2 = 新しいシングルユーザー() コンソールにログ出力します。u1 === u2; 方法5コンストラクタでnew.targetを使用して、newキーワードを使用するかどうかを決定します。 クラスUser{ コンストラクタ(){ if(new.target !== ユーザー){ 戻る } if(!User._instance){ this.name = 'xm' User._instance = これ } User._instanceを返す } } const u1 = 新しいユーザー() const u2 = 新しいユーザー() コンソールにログ出力します。u1 === u2; 方法6静的メソッドの使用 クラスユーザー{ コンストラクタ() { this.name = 'xm' } 静的getInstance() { if (!User._instance) { User._instance = 新しいUser() } User._instanceを返す } } 定数 u1 = User.getInstance() 定数 u2 = User.getInstance() コンソールにログ出力します。u1 === u2; 要約するシングルトンパターンの JS 実装に関するこの記事はこれで終わりです。より関連性の高い JS シングルトンパターンのコンテンツについては、123WORDPRESS.COM の以前の記事を検索するか、以下の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。 以下もご興味があるかもしれません:
|
<<: Linux LVM 論理ボリューム構成プロセス (作成、増加、削減、削除、アンインストール) の詳細な説明
>>: mysql 実行プラン ID が空である (UNION キーワード) の詳細な説明
書き方1: sas_order_supply_month_pay セットを更新 RECEIVE_TI...
Nginx を使用して同じドメイン名で複数のプロジェクトを構成するには、次の 2 つの方法があります...
MySQL エラー:エラー コード: 1293 テーブル定義が正しくありません。CURRENT_T...
この記事の例では、文字の出現回数をカウントするJavaScriptの具体的なコードを参考までに共有し...
まず、provide/inject を使用する理由について説明しましょう。祖父コンポーネントと孫コン...
目次ポッドを作成するには? kubectl ツールポッドを作成するには?前回の記事では、コンテナとポ...
mysql のような php switch case ステートメント。 xxフィールドを選択、ケース...
1. はじめにresolv.conf は、さまざまなオペレーティング システムのドメイン ネーム シ...
禅コーディングテキストエディタプラグインです。 Zen Coding を使用するテキスト エディター...
例を見てみましょう。コードは次の通り非常にシンプルです。コードをコピーコードは次のとおりです。 &l...
目次JavaScript イベント:よく使用されるイベント:イベントアクション要約するJavaScr...
<br />原文: http://research.microsoft.com/~hel...
目次1. 解決策2. MySQLの文字セット文字セット検証ルール次のように簡単なテーブルクエリを実行...
ブラウザウィンドウの中央に要素を配置する方法まず、コード ブロックを示します。すでにコードを理解して...
目次1. 背景2. 前提条件https:証明書システム: 3. 操作プロセス3.1 証明書の生成3....