• javascript学习(9)——[设计模式]单例


    单例模式,相信大家对此都不陌生,我们主要讲下javascript中几个比较常见的设计模式:

    (1).普通的单体
    (2).具有局部变量的强大单体
    (3).惰性单体
    (4).分支单体

    下面我们就一一进行介绍:

    (1)普通的单体

    /**
     * 单例模式在JS中使用非常的频繁
     * 通过确保单例对象只存在一个实例,
     * 你就可以确信自己在所有的代码中使用的是全局资源
     */
    (function(){
    	//先看来一个最简单的单体
    	//例如用户登录后的信息可以用一个单体存储
    	var UserInfo = {
    		name:"hello",
    		code:"00101",
    		deptName:'PD',
    		deptCode:'PD001',
    		getName : function(){
    			return "hello";
    		}
    	}
    	alert(UserInfo.getName());
    	//这就是一个最简单的单体
    	//他用来换分命名空间,并且将一群相关的属性和方法组织到一起
    	//我们可以用.来访问他
    	var comm = {};
    	comm.UserInfo = {
    		name:"hello",
    		code:"00101"		
    	}
    	comm.funcInfo ={
    		funcName:'',
    		funcCode:""
    	}
    	//在大型的项目下,存在这你写的代码,还有你引用外界JS类库
    	//还有其他同事写的代码和类库
    	//我们通过单体模式就可以很好的区分他
    	//这点你只能慢慢的体会了.........
    })()

    (2)具有局部变量的强大单体

    /**
     * 单例模式在JS中使用非常的频繁
     * 通过确保单例对象只存在一个实例,
     * 你就可以确信自己在所有的代码中使用的是全局资源
     */
    (function(){
    	//模拟一个Ajax操作
    	function Ajax(){}
    	Ajax.request = function(url,fn){
    		if(true){
    			fn("abc","EXTJS4");
    		}
    	}
    	//我们通过闭包的原理解决在01例子中出现的问题
    	var UserInfo = (function(){
    		//利用闭包是单体有自己的私有局部变量
    		var name = "";
    		var code = "";
    		//利用Ajax访问数据库来取得数据
    		Ajax.request("abc,function(n,c){
    			name = n;
    			code = c;
    		})
    		return {
    			name:name,
    			code:code
    		}
    	})()
    	//实验
    	alert(UserInfo.name)
    })()

    return的时候就是直接给你返回一个单例


    (3)惰性单体

    /**
     * 单例模式在JS中使用非常的频繁
     * 通过确保单例对象只存在一个实例,
     * 你就可以确信自己在所有的代码中使用的是全局资源
     */
    (function(){
    	//模拟一个Ajax操作
    	function Ajax(){}
    	Ajax.request = function(url,fn){
    		if(true){
    			fn("abc","EXTJS4");
    		}
    	}
    	//我们同闭包的原理解决在01例子中出现的问题
    	var UserInfo = (function(){
    		var userInfo = "";//私有变量
    		function init(){
    			//利用闭包是单体有自己的私有局部变量
    			var name = "";
    			var code = "";
    			//利用Ajax访问数据库来取得数据
    			Ajax.request("abc",function(n,c){
    				name = n;
    				code = c;
    			})
    			return {
    				name:name,
    				code:code
    			}
    		}
    		return {
    			getInstance : function(){
    				if(userInfo){
    					return userInfo;
    				}else{
    					userInfo = init();
    					return userInfo;	
    				}
    			}
    		}
    	})()
    	alert(UserInfo.getInstance().name)
    })()

    相对来说,到第三种方法,我们在上边看到我们java中编写单例的影子了


    (4)分支单体

    /**
     * 分支单体
     * 用处:
     * 在做Ajax的时候根据不同的浏览器获得不同的XHR(XMLHttpRequest)
     * 在不同分辨率的情况下初始化不一样的界面(PCAT2)
     */
    (function(){
    	//得到机器的分辨率
    	var screenWidth = window.screen.width;
    	var screenheigth = window.screen.heigth;
    	var portalInfo = (function(){
    		var $12801024 = {info:'1,2,3,5'}
    		var $1024768 = {info:'4,2,1,2'}
    		if(screenWidth == 1280){
    			return $12801024;
    		}else if(screenWidth == 1024){
    			return $1024768;
    		}
    	})();
    	alert(portalInfo.info);
    })()
    //这些并非 javascript的高深技术,是他的使用技巧

    其中第四种方法,也在实际项目中也比较常用


  • 相关阅读:
    微信小程序~事件绑定和冒泡
    为promise增加abort功能
    Object构造函数的方法 之 Object.freeze
    ES6新特性:JavaScript中内置的延迟对象Promise
    js 预编译
    什么是PWA?PWA的发展趋势
    CSS隐藏元素的方法及区别
    网页编码:UTF-8、GB2312
    Mixin 和 CSS Guards
    css自定义checkbox样式
  • 原文地址:https://www.cnblogs.com/sunyingyuan/p/3686223.html
Copyright © 2020-2023  润新知