導入
この章から始めて、JavaScriptで使用されるさまざまなデザインパターンの実装を徐々に紹介します。ここでは、パターン自体のあまり多くの理論を導入するのではなく、実装にのみ焦点を当てます。 OK、正式に開始します。
伝統的な開発エンジニアの目には、シングルトンは、クラスのインスタンスが1つしかないことを確認することです。実装方法は、一般に、最初にインスタンスが存在するかどうかを判断することです。存在する場合、直接返され、存在しない場合は作成されてから返されます。これにより、クラスのオブジェクトが1つしかないことが保証されます。 JavaScriptでは、Singletonは名前空間プロバイダーとして機能し、オブジェクトにアクセスするためにグローバルネームスペースから一意のアクセスポイントを提供します。
文章
JavaScriptでは、シングルトンを実装する多くの方法があります。最も簡単な方法は、文字通りのオブジェクトを使用することです。これには、多数のプロパティとメソッドを含めることができます。
コードコピーは次のとおりです。
var mysingleton = {
プロパティ1:「何か」、
プロパティ2:「何か他のもの」、
方法1:function(){
console.log( 'hello world');
}
};
後でオブジェクトを拡張したい場合は、独自のプライベートメンバーとメソッドを追加してから、閉鎖を使用して、これらの変数とその内部の関数宣言をカプセル化できます。公開したい一般会員と方法のみが公開されます。サンプルコードは次のとおりです。
コードコピーは次のとおりです。
var mysingleton = function(){
/*ここでプライベート変数と方法を宣言します*/
var privatevariable = '何かプライベート';
関数showprivate(){
console.log(privatevariable);
}
/ *パブリック変数とメソッド(プライベート変数とメソッドにアクセスできます) */
戻る {
publicMethod:function(){
showprivate();
}、
PublicVar:「一般の人々はこれを見ることができます!」
};
};
var single = mysingleton();
single.publicmethod(); //出力「プライベート」
console.log(single.publicvar); //出力「一般の人々はこれを見ることができます!」
上記のコードはかなり良いですが、それを使用したい場合はどうでしょうか。リソースを保存するために、次のように、これらのコードを別のコンストラクターの初期化できます。
コードコピーは次のとおりです。
var singleton =(function(){
varインスタンス化。
function init(){
/*ここでシングルトンコードを定義します*/
戻る {
publicMethod:function(){
console.log( 'hello world');
}、
publicProperty:「テスト」
};
}
戻る {
getInstance:function(){
if(!instantiated){
instantiated = init();
}
インスタンス化された戻り;
}
};
})();
/*インスタンスを取得するためにパブリックメソッドを呼び出す:*/
singleton.getInstance()。publicMethod();
シングルトンを実装する方法は知っていますが、シングルトンが使用する最良のシナリオはどのようなシナリオですか?実際、シングルトンは一般に、システム間のさまざまなモード間の通信調整に使用されます。次のコードは、シングルトンのベストプラクティスです。
コードコピーは次のとおりです。
var singletontester =(function(){
//パラメーター:シングルトンに渡されたパラメーターのセット
関数Singleton(args){
// args変数を受信パラメーターに設定するか、空にする(提供されていない場合)
var args = args || {};
//名前パラメーターを設定します
this.name = 'singletontester';
// pointxの値を設定します
this.pointx = args.pointx || 6; //受信したパラメーターから取得するか、デフォルト値に設定します
//先のとがった値を設定します
this.pointy = args.pointy || 10;
}
//インスタンスコンテナ
varインスタンス;
var _static = {
名前: 'Singletontester'、
//インスタンスを取得する方法
// Singletonインスタンスを返します
getInstance:function(args){
if(instance === undefined){
instance = new Singleton(args);
}
インスタンスを返す;
}
};
_staticを返す;
})();
var singletontest = singletontester.getInstance({pointx:5});
console.log(singletontest.pointx); //出力5
その他の実装方法
方法1:
コードコピーは次のとおりです。
関数Universe(){
//インスタンスがあるかどうかを決定します
if(typeof universe.instance === 'object'){
universe.instanceを返します。
}
//その他のコンテンツ
this.start_time = 0;
this.bang = "big";
//キャッシュ
Universe.instance = this;
//暗黙的にこれを返します
}
// テスト
var uni = new Universe();
var uni2 = new Universe();
console.log(uni === uni2); // 真実
方法2:
コードコピーは次のとおりです。
関数Universe(){
//キャッシュインスタンス
var instance = this;
//その他のコンテンツ
this.start_time = 0;
this.bang = "big";
//コンストラクターを書き直します
Universe = function(){
インスタンスを返す;
};
}
// テスト
var uni = new Universe();
var uni2 = new Universe();
uni.bang = "123";
console.log(uni === uni2); // 真実
console.log(uni2.bang); // 123
方法3:
コードコピーは次のとおりです。
関数Universe(){
//キャッシュインスタンス
varインスタンス;
//関数を再構築します
Universe = Function Universe(){
インスタンスを返す;
};
//プロトタイププロパティのポスト処理
Universe.prototype = this;
// 例
instance = new Universe();
//コンストラクターポインターをリセットします
instance.constructor = universe;
//その他の関数
instance.start_time = 0;
instance.bang = "big";
インスタンスを返す;
}
// テスト
var uni = new Universe();
var uni2 = new Universe();
console.log(uni === uni2); // 真実
//プロトタイププロパティを追加します
Universe.prototype.nothing = true;
var uni = new Universe();
Universe.prototype. Everything = true;
var uni2 = new Universe();
console.log(uni.nothing); // 真実
console.log(uni2.nothing); // 真実
console.log(uni. Everything); // 真実
console.log(uni2. Everything); // 真実
console.log(uni.constructor === Universe); // 真実
方法4:
コードコピーは次のとおりです。
ヴァルユニバース;
(関数 () {
varインスタンス;
Universe = Function Universe(){
if(instance){
インスタンスを返す;
}
instance = this;
//その他のコンテンツ
this.start_time = 0;
this.bang = "big";
};
}());
//テストコード
var a = new Universe();
var b = new Universe();
アラート(a === b); // 真実
A.bang = "123";
アラート(B.Bang); // 123