### 一、定義
保證一個類僅有一個實例,并提供一個訪問它的全局訪問點。
當單擊登陸按鈕,頁面中出現一個登陸浮窗,這個登陸浮窗是唯一的,無論單擊多少次登陸按鈕,這個浮窗都只會被創建一次,那么這個登陸浮窗就適合用單例模式來創建。
### 二、實現原理
要實現單例并不復雜,使用一個變量來標志當前是否已經為某個類創建過對象,如果是,則在下一次獲取該類的實例時,直接返回之前創建的對象。
### 三、假單例
全局變量不是單例模式,但在JavaScript開發中,我們經常會把全局變量當成單例來使用。
~~~
var a = {};
~~~
降低全局變量帶來的命名污染
(1)使用命名空間
~~~
var namespace1 = {
a: function(){},
b: 2
}
~~~
(2)使用閉包封裝私有變量
~~~
var user = (function() {
var _name = 'lee',
_age = '25';
return {
getUserInfo: function() {
return _name + ":" + _age;
}
};
})();
~~~
### 四、惰性單例:在需要的時候才能創建對象實例。
~~~
var getSingle = function(fn) {
var result;
return function() {
return result || (result = fn.apply(this, arguments));
};
};
// 測試
function testSingle(){}
getSingle(testSingle)() === getSingle(testSingle)(); // true
~~~
### 五、補充:
**(1)懶加載**
~~~
var lazyload = function() {
console.log(1);
lazyload = function() {
console.log(2);
}
return lazyload();
}
lazyload();
~~~
**(2)預加載**
~~~
var preload = (function() {
console.log(1);
preload = function() {
console.log(2);
};
return preload;
})();
preload();
~~~
轉載請標明出處:[http://blog.csdn.net/ligang2585116](http://blog.csdn.net/ligang2585116)