JavaScript使用閉包實現單例模式

閉包是JS的一種特性,其中一點就是:能夠將外部函數的變量保存在內存中,利用這一特性,咱們能夠用來實現類的單例模式。閉包

首先須要瞭解何爲單例模式:函數

意圖:保證一個類僅有一個實例,並提供一個訪問它的全局訪問點。spa

主要解決:一個全局使用的類頻繁地建立與銷燬。code

什麼時候使用:當您想控制實例數目,節省系統資源的時候。對象

如何解決:判斷系統是否已經有這個單例,若是有則返回,若是沒有則建立。blog

瞭解完單例模式以後,咱們不難寫出如下代碼:內存

var HeadClass = function () { };
var Head = (function () { // 匿名自執行函數
    var instance; // 聲明一個instance對象
    return function () {
        if (instance) { // 若是已存在 則返回instance
            return instance;
        }
        instance = new HeadClass() // 若是不存在 則new一個HeadClass對象
        return instance;
    }
})();
var a = new Head();
var b = new Head();
console.log(a===b) // true

咱們只須要調用new Head()便可構造一個單例模式對象,但同時也能夠調用new HeadClass()構造新的對象,那麼咱們如何加以限制,讓其只能調用new Head()來構造對象呢?資源

其實咱們只須要把HeadClass聲明放入匿名自執行函數Head內便可:io

var Head = (function () {
    var HeadClass = function () { }; // 聲明HeadClass對象,沒法在外部直接調用
    var instance; // 聲明一個instance對象
    return function () {
        if (instance) { // 若是已存在 則返回instance
            return instance;
        }
        instance = new HeadClass() // 若是不存在 則new一個
        return instance;
    }
})();
var a = Head();
var b = new Head();
console.log(a===b) // true
var a = HeadClass(); // 報錯,HeadClass is not defined
相關文章
相關標籤/搜索