91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

javascript 單例模式詳解及簡單實例

發布時間:2020-10-21 11:30:02 來源:腳本之家 閱讀:144 作者:lqh 欄目:web開發

JS 單例模式

概要:

單例指一個類只有一個實例,這個類自行創建這個實例。

利用對象字面量直接生成一個單例:

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指向這個對象,所以可以判斷類的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類,所以個人感覺不夠語義化。

 上面的例子用es6重構的寫法。

類內部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
  

當然除了這兩種以外還有別的方式能實例化一個單例。

感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

东丽区| 中西区| 济南市| 抚顺县| 新余市| 巨野县| 南汇区| 嘉义市| 巴中市| 徐州市| 萨嘎县| 葫芦岛市| 海淀区| 兴仁县| 土默特左旗| 图木舒克市| 荥经县| 大洼县| 全椒县| 九寨沟县| 闵行区| 南召县| 平果县| 宜宾县| 大荔县| 西乡县| 定结县| 新津县| 舟山市| 巴彦淖尔市| 阿尔山市| 鄂托克前旗| 怀远县| 葵青区| 红安县| 合肥市| 合水县| 泸溪县| 乌兰浩特市| 石泉县| 云霄县|