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