ホームページ > 記事 > ウェブフロントエンド > JavaScriptを深く理解するシリーズ(25):デザインパターンのシングルトンパターンを詳しく解説_基礎知識
はじめに
この章から、JavaScript で使用されるさまざまなデザイン パターンの実装を徐々に紹介していきます。ここでは、パターン自体の理論についてはあまり紹介せず、実装についてのみ説明します。はい、正式に始まりました。
従来の開発エンジニアにとって、シングルトンとは、クラスにインスタンスが 1 つだけ存在することを保証するものであり、インスタンスが存在するかどうかを最初に判断し、存在しない場合はそれを直接返します。これにより、クラスにはインスタンス オブジェクトが 1 つだけ存在することが保証されます。 JavaScript では、シングルトンは名前空間プロバイダーとして機能し、グローバル名前空間からオブジェクトへの一意のアクセス ポイントを提供します。
テキスト
JavaScript では、シングルトンを実装する方法が数多くあります。最も簡単な方法の 1 つは、多数のプロパティとメソッドを含めることができるオブジェクト リテラルを使用することです。
関数 showPrivate() {
console.log(privateVariable);
}
/* パブリック変数とメソッド (プライベート変数とメソッドにアクセス可能) */
publicMethod: function () {
showPrivate();
}、
publicVar: '一般の人もこれを見ることができます!'
};
};
var single = mySingleton();
console.log(single.publicVar); // 出力「一般の人もこれを見ることができます!」
インスタンス化 = init();
}
インスタンス化された戻り値;
}
};
})();
/*パブリック メソッドを呼び出してインスタンスを取得します:*/
Singleton.getInstance().publicMethod();
シングルトンの実装方法はわかりましたが、シングルトンはどのようなシナリオで使用するのが最適でしょうか?実際、シングルトンは通常、システム間のさまざまな通信モードを調整するために使用されます。次のコードはシングルトンのベスト プラクティスです。
関数 Singleton(args) {
var args = args ||
//名前パラメータを設定します
This.name = 'SingletonTester';
//pointXの値を設定します
This.pointX = args.pointX || // 受け取ったパラメータから取得するか、デフォルト値に設定します
//pointY
の値を設定します
This.pointY = args.pointY || 10;
//インスタンスコンテナ
var インスタンス;
名前: 'SingletonTester'、
// シングルトン インスタンスを返します
getInstance: function (args) {
If (インスタンス === 未定義) {
インスタンス = new Singleton(args);
}
インスタンスを返す;
}
};
_static を返す;
})();
console.log(singletonTest.pointX); // 出力 5
その他の実装方法
方法 1:
If (typeof Universe.instance === 'object') {
return Universe.instance;
}
This.start_time = 0;
This.bang = "ビッグ";
Universe.instance = this;
}
var uni = 新しい Universe();
var uni2 = 新しい Universe();
console.log(uni === uni2) // true
方法 2:
var インスタンス = this;
This.start_time = 0;
This.bang = "ビッグ";
Universe = function () {
return インスタンス;
};
}
var uni = 新しい Universe();
var uni2 = 新しい Universe();
uni.bang = "123";
console.log(uni === uni2) // true
console.log(uni2.bang); // 123
方法 3:
// キャッシュインスタンス
var インスタンス;
// リコンストラクター関数
Universe = function Universe() {
return インスタンス;
};
// 後処理プロトタイプのプロパティ
Universe.prototype = this;
// 例
インスタンス = new Universe();
// コンストラクター ポインターをリセットします
Instance.constructor = Universe;
// その他の関数
Instance.start_time = 0;
Instance.bang = "ビッグ";
インスタンスを返します;
}
// テスト
var uni = 新しい Universe();
var uni2 = 新しい Universe();
console.log(uni === uni2) // true
//プロトタイプ属性を追加します
Universe.prototype.nothing = true;
var uni = new Universe();
Universe.prototype.everything = true;
var uni2 = 新しい Universe();
console.log(uni.nothing) // true
console.log(uni2.nothing) // true
console.log(uni.everything) // true
;
console.log(uni2.everything) // true
console.log(uni.constructor === Universe); // true
方法 4:
(関数() {
変数インスタンス;
Universe = function Universe() {
if (インスタンス) {
インスタンスを返す;
}
インスタンス = this;
// その他のコンテンツ
This.start_time = 0;
This.bang = "ビッグ";
};
} ());
//テストコード
var a = 新しいユニバース();
var b = 新しいユニバース();
アラート(a === b) // true
a.bang = "123";
アラート(b.bang); // 123