JavaScript使用閉包實現單例模式


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

首先需要了解何為單例模式:

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

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

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

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

了解完單例模式之后,我們不難寫出以下代碼:

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內即可:

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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM