シングルトン
クラスはインスタンスを1つだけ持っていることを確認し、それをアクセスするためのグローバルアクセスポイントを提供します。
シングルトンパターンは、我々は一つだけ、このようなスレッドプール、グローバル・キャッシュ、ブラウザウィンドウのオブジェクトを必要とする傾向があるいくつかのオブジェクトがあり、一般的なパターンです。
JavaScriptでSingletonパターン
1.名前空間の使用
JavaScriptでは、多種多様な方法の単一の例が実現され、最も簡単な方法は、プロパティとメソッドのリテラル多数を含むことができ、リテラル方法でオブジェクトを使用することです。
let people = {
name: "Jack",
age: 18,
play() {
console.log('i like game');
}
}
また、動的に名前空間を作成することができます
// 定义对象
var MyApp = {};
// 对象的方法
MyApp.namespace = function( name ){
// 将参数分割成数组
var parts = name.split( '.' );
// 定义变量
var current = MyApp;
// 创建对象里面的属性
for ( var i in parts ){
if ( !current[ parts[ i ] ] ){
current[ parts[ i ] ] = {};
}
current = current[ parts[ i ] ];
}
};
MyApp.namespace( 'event' );
MyApp.namespace( 'dom.style' );
/******************* 上面没看懂没关系 ***********************/
// 上述代码等价于
var MyApp = {
event: {},
dom: {
style: {}
}
};
2.閉鎖パッケージプライベート変数
var user = (function(){
var __name = 'sven',
__age = 29;
return {
getUserInfo: function(){
return __name + '-' + __age;
}
}
})();
私たちは、プライベート変数を強調することに合意した__name
と__age
、彼らは外部からのアクセスは、世界的な環境汚染のコマンドを回避未満、2つの変数で生成されたスコープの閉鎖にカプセル化されています。
例は、標準的な単一モードを実現します
var Singleton = function( name ){
this.name = name;
this.instance = null;
};
Singleton.prototype.getName = function(){
alert ( this.name );
};
Singleton.getInstance = function( name ){
if ( !this.instance ){
this.instance = new Singleton( name );
}
return this.instance;
};
var a = Singleton.getInstance( 'sven1' );
var b = Singleton.getInstance( 'sven2' );
alert ( a === b ); // true
当社は、Singleton.getInstance
取得するために使用されるSingleton
固有のオブジェクトクラスを、このアプローチは比較的簡単ですが、問題があり、クラスの「不透明度」が追加され、Singleton
によって過去に、ユーザークラスが、これはシングルトンクラスであることを知っている必要がありますnew XXX
への道我々が使用することを求めてさまざまなオブジェクト、取得しSingleton.getInstance
たオブジェクトを取得するために。
透明シングルトン
var CreateDiv = (function(){
var instance;
var CreateDiv = function( html ){
if ( instance ){
return instance;
}
this.html = html;
this.init();
return instance = this;
};
CreateDiv.prototype.init = function(){
var div = document.createElement( 'div' );
div.innerHTML = this.html;
document.body.appendChild( div );
};
return CreateDiv;
})();
var a = new CreateDiv( 'sven1' );
var b = new CreateDiv( 'sven2' );
alert ( a === b ); // true
置くためにinstance
一緒にパッケージを、私たちは、匿名関数とクロージャの自己実行を使用して、この無名関数が返してみましょう
真のSingleton
いくつかのプログラムの複雑さを増すコンストラクタを、
シングルモードで3.エージェント
var CreateDiv = function( html ){
this.html = html;
this.init();
};
CreateDiv.prototype.init = function(){
var div = document.createElement( 'div' );
div.innerHTML = this.html;
document.body.appendChild( div );
};
// 代理类 proxySingletonCreateDiv:
var ProxySingletonCreateDiv = (function(){
var instance;
return function( html ){
if ( !instance ){
instance = new CreateDiv( html );
}
return instance;
}
})();
var a = new ProxySingletonCreateDiv( 'sven1' );
var b = new ProxySingletonCreateDiv( 'sven2' );
alert ( a === b );
差がある前に、今私たちが持っているとプロキシクラスを導入するとして、我々はまた、シングルトンパターンの準備を完了した
移動プロキシクラスの単一の例を管理する責任のロジックproxySingletonCreateDiv
では。したがって、CreateDiv
そのでは、通常のクラスになるproxySingletonCreateDiv
組み合わせの実施形態は、単一モードの効果を得ることができます。
不活性シングルトン
不活性単場合は、必要な場合にのみ、オブジェクトインスタンスを作成することをいいます。
var Singleton = (function () {
var instantiated;
function init() {
/*这里定义单例代码*/
return {
publicMethod: function () {
console.log('hello world');
},
publicProperty: 'test'
};
}
return {
getInstance: function () {
if (!instantiated) {
instantiated = init();
}
return instantiated;
}
};
})();
/*调用公有的方法来获取实例:*/
Singleton.getInstance().publicMethod();
省資源の目的を達成するために、上記の方法を通じて、我々は唯一、使用時に初期化することができます
現時点では、新しい理解のうえ、そんなにSingletonパターンを理解するために、我々は(〜¯▽¯)〜更新していきます、と滑って転落します