【代码笔记】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

相关文章
相关标签/搜索