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

溫馨提示×

溫馨提示×

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

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

JS中單例模式的定義與實現方法

發布時間:2020-07-28 15:42:44 來源:億速云 閱讀:121 作者:小豬 欄目:web開發

這篇文章主要講解了JS中單例模式的定義與實現方法,內容清晰明了,對此有興趣的小伙伴可以學習一下,相信大家閱讀完之后會有幫助。

良好的設計模式可以顯著提高代碼的可讀性,降低復雜度和維護成本。筆者打算通過幾篇文章通俗地講一講常見的或者實用的設計模式。

今天先從最簡單的一個入手:單例模式。

文中的示例代碼會使用 ES6 語法,盡量簡化不必要的細節

概念

單例模式(Singleton)屬于創建型的設計模式,它限制我們只能創建單一對象或者某個類的單一實例。

通常情況下,使用該模式是為了控制整個應用程序的狀態。在日常的開發中,我們遇到的單例模式可能有:Vuex 中的 StoreVue 的根實例任何導出單個對象的 ES6 模塊等。

字面量寫法

最簡單的單例其實就像下面這樣:

const cat = {
  name: 'mi',
  age: 4
}

了解 const 語法的小伙伴都知道,這只喵是不能被重新賦值的,但是它里面的屬性其實是可變的。

如果想要一個不可變的單例對象:

const cat = {
  name: 'mi',
  age: 4
}

Object.freeze(cat);

這樣就不能新增或修改這只喵上的任何屬性,它變成了 冰凍喵~

如果是在模塊中使用,上面的寫法并不會污染全局作用域,但是直接生成一個固定的對象缺少了一些靈活性。

常用寫法

相對而言,使用類或工廠方法來實現單例更加常用。假設我們有一個叫作 Logger 的類,它具有和 Console 相同的 API。

類單例

類的單例寫法非常常用,如果我們想要這么使用它:

const logger = new Logger();
logger.log('msg');

// 這里大概寫了 1000 行代碼

const logger2 = new Logger();
logger.log('new msg');

logger === logger2; // true

即盡管 new 了多次 Logger,它返回的都是同一個實例。

下面直接看最實用的實現方式:

class Logger {
  constructor () {
    if (!Logger._singleton) {
      Logger._singleton = this;
    }
    return Logger._singleton;
  }
  
  log (...args) {
    console.log(...args);
  }
}

export default Logger;

上面的方式將單例對象存儲在了構造器上,這樣的話不管 new Logger 多少次,返回的都是同一個 Logger 實例了。

這里有一個細節需要注意,即 new 關鍵字后面的構造函數如果顯式返回一個對象,new 表達式就會返回該對象。

具體可參見 《你不知道的 JavaScript (上卷)》中的 new 綁定 相關章節。

工廠單例

如果不喜歡用 new 關鍵字,可以使用工廠方法返回單例對象。

let logger = null

class Logger {
  log (...args) {
    console.log(...args);
  }
}

function createLogger() {
  if (!logger) {
    logger = new Logger();
  }
  return logger;
}

export default createLogger;

上面的代碼相當于在模塊內部緩存了 logger 實例,然后導出了一個工廠方法。這種寫法在模塊化代碼中比較常見,工廠方法也可以接收參數用來初始化單例對象。

看完上述內容,是不是對JS中單例模式的定義與實現方法有進一步的了解,如果還想學習更多內容,歡迎關注億速云行業資訊頻道。

向AI問一下細節

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

AI

老河口市| 遵义市| 定兴县| 乌鲁木齐县| 永靖县| 高邑县| 南漳县| 瑞丽市| 普格县| 荥经县| 凤凰县| 德安县| 凤山市| 泰兴市| 连南| 南乐县| 肃北| 永泰县| 海口市| 陵川县| 桦川县| 平邑县| 安阳市| 界首市| 永兴县| 竹山县| 云霄县| 宁化县| 辛集市| 镇原县| 贵州省| 新蔡县| 顺平县| 蒲江县| 鄂伦春自治旗| 罗山县| 肃北| 黔东| 垫江县| 平江县| 凉山|