【代碼筆記】js單例模式

單例模式html

特色:確保類在全局只有一個實例,且提供一個它的全局訪問點。閉包

實現思路:若是某個單例實例已存在,返回該實例以供訪問,不然才建立實例app

/* 通用惰性加載單例函數
*  @getSingle 管理單例的實現
*  @create 管理建立時的業務邏輯
*  調用代碼 var singleObject = createSingle();
*/
var getSingle = function  (fn) {
	var result;
	return result || ( result = fn.apply( this,arguments ) );
}
var create = function  () {
	//建立實例對象的邏輯代碼
	//return ... 返回實例對象或true(用於判斷實例是否已存在)
}
//單例化create返回的實例對象
var createSingle = getSingle( create );

ps:jQuery的實現就符合單例模式(全局只有一個jQuert實例,經過$調用),jq利用當即調用表達式,匿名函數以及閉包來實現這一點。首先匿名函數不存在外部引用,用當即調用表達式使匿名函數執行,使得匿名函數只能執行一次,從而最多隻有一個實例,再利用閉包把實例傳出,獲得一個全局訪問點。這裏個人理解有限,只是說一下個人想法,可能並不是徹底正確。函數

//單例化jq方法一
(function(window, factory) {
    factory(window)
}(this, function() {
    return function() {
       //jQuery的調用
    }
}))
//單例化jq方法二
(function(window, undefined) {
    var jQuery = function() {}
    // ...
    window.jQuery = window.$ = jQuery;//用全局變量來接收jq變量,也是讓外部變量持有該變量使之壽命延長
})(window);

進一步瞭解能夠看艾倫 Aaron 老師的博客 >>jQuery源碼分析系列源碼分析

實例:this

//
/* 動態建立命名空間
*  MyApp.namespace( xxx )  =>create  MyApp.xxx
*  MyApp.namespace( xxx.yyy )  =>create  MyApp.xxx.yyy
*  屢次調用,屬性疊加
*/
var MyApp = {};
MyApp.namespace = function  ( name ) {
	var parts = name.split( '.' );
	var current = MyApp;
	for ( var i in parts ){
		if( !current[ parts[ i ] ] ){
			current[ parts[ i ] ] = {};
		}
		current = current[ parts[ i ] ] );
	}
};

惰性單例加載也經常使用於彈窗界面的建立。 spa

相關文章
相關標籤/搜索