單例模式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