定義設計模式
一個構造函數在構造出一個對象後,以後再使用這個構造函數構造對象時,不會是新的對象,依舊是上一次的對象.也就是說:::瀏覽器
確保一個類僅有一個實例,並提供一個訪問它的全局訪問點。緩存
經過一個實用場景來理解單例模式的概念。當咱們點擊登陸按鈕的時候,會出現一個登陸的彈窗,而這個彈窗是惟一的,不論咱們點擊多少次登陸按鈕,彈窗只會被建立一次。函數
好比線程池、全局緩存等。咱們所熟知的瀏覽器的window對象就是一個單例,在JavaScript開發中,對於這種只須要一個的對象,咱們的實現每每使用單例。學習
實現思路this
用一個變量來標識當前的類已經建立過對象,若是下次獲取當前類的實例時,直接返回以前建立的對象便可。spa
實現1:最簡單的對象字面量prototype
var singleton = { attr : 1, method : function(){ return this.attr; } } var t1 = singleton ; var t2 = singleton ; 那麼很顯然的, t1 === t2 。
這個在日常使用的時候,仍是挺多的,在沒有學習單例設計模式的概念以前,不知道這種也屬於單例的。不過,存在的不足之處就是沒有什麼封裝,全部的屬性方法都是暴露的。對於一些須要使用私有變量的狀況也不太合適。不過就經過這個例子加深一下對單例的概念的理解。線程
實現2:設計
// 定義一個類 function Singleton(name) { this.name = name; this.instance = null; } // 原型擴展類的一個方法getName() Singleton.prototype.getName = function() { console.log(this.name) }; // 獲取類的實例 Singleton.getInstance = function(name) { if(!this.instance) { this.instance = new Singleton(name); } return this.instance }; // 獲取對象1 var a = Singleton.getInstance('a'); // 獲取對象2 var b = Singleton.getInstance('b'); // 進行比較 console.log(a === b); // true
總結: