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