javascript単一の例のモードの詳しい解説と簡単な例

2714 ワード

JS単例モード
概要:
単一の例とは、1つのクラスが1つのインスタンスしかないことを指し、このクラスは自らこのインスタンスを作成する.
対象の字面量を利用して直接に一つの例を生成する:

var singleton = {
  prop: 1,
  method: function(){
    console.log(a);  //1
  }
}
厳密には対象の字面量は一例のモードではなく、一例を生成するのは対象の字面量の役割であり(すでにカプセル化されている)、一例のモードは設計モードである(自分で考えたり設計したりする必要がある).
クラス内でnewを用いてインスタンスを生成する単一の例のモード:

var instance;
var foo = function(){
  if(!instance){
    instance = new Singleton();
  }
  return instance;
  function Singleton(){
    this.name = 'single';
    this.method = function(){
      console.log(this.name);
    }
  };
}
 
var a = foo();
var b = foo();
a.method();       //single
console.log(a === b);  //true
一例のモードは、一例が生成されたかどうかを検出するだけでよい.インスタンスがない場合は、インスタンスが生成される.すでに生成されている場合は、この例に戻ります.このクラスはこの例だけであることを保証します.
Hoistingのために、関数は前もって声明しますので、singleton関数はどこに置いても大丈夫ですが、毎回呼び出しても関数singletonを宣言します.優雅さが足りないかもしれません.
newキーワードは実行関数であり、このオブジェクトを指すので、クラスのthisがinstanceに与えられているかどうかを判断できます.

var instance;
var Singleton = function(){
  if(instance){
    return instance;
  }
  instance = this;
  this.name = 'single';
  this.method = function(){
    console.log(this.name);
  }
}
 
var a = new Singleton();
var b = new Singleton();
a.method();       //single
console.log(a === b);  //true
この例では、instanceをSingletonというクラスに向けて、クラスの外部でnewを通じて実用化し、上の例のnew異曲と同じです.thisを修正してSingletonクラスを実行したかどうかを測定するため、個人的には意味が足りないと感じます.
 上の例はes 6再構成の書き方です.
クラス内部new生成単例:

var instance;
class foo{
  static Singleton(){
    if(!instance){
      instance = new foo();
    }
    return instance;
  }  
  method(){
    this.name = 'single';
    console.log(this.name);
  }
}
 
var a = foo.Singleton();
var b = foo.Singleton();
a.method();       //single
console.log(a === b);  //true
this指向の変更の生成例:

var instance;
class foo{
  constructor(){
    if(!instance){
      this.Singleton();
    }
    return instance;
  }
  Singleton(){
    instance = this;
    this.name = 'single';
    this.method = function(){
      console.log(this.name);
    }
  }
}
 
var a = new foo();
var b = new foo();
a.method();       //single
console.log(a === b);  //true
  
もちろんこの二つ以外にも一つの例を具体化できる方法があります.
読んでくれてありがとうございます.みなさんのご協力をお願いします.ありがとうございます.