閉包是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