本文共 2795 字,大约阅读时间需要 9 分钟。
单体(singleton)模式是javascript中最基本但又是最有用的模式之一,它可能比其他任何模式都常用。这种模式提供了一种将代码组织为一个逻辑单元的手段,这个逻辑单元中的代码可以通过单一的变量进行访问。通过确保单体对象只存在一份实例,你就可以确信自己的所有代码使用的都是同样的全局资源
var Singleton = { attr1: true , attr2: 10 , method1 : function(){ alert('我是方法1'); }, method2 : function(){ alert('我是方法2'); }};alert(Singleton.attr1);// 补充 :划分命名空间 (区分代码) Ext.Manager.attr1 / method1var BHX = {};BHX.Singleton = { attr1: true , attr2: 10 , method1 : function(){ alert('我是方法1'); }, method2 : function(){ alert('我是方法2'); } };BHX.Singleton.method1();
闭包主要的目地是保护数据,可以添加自己的私有成员,外界无法直接访问,只能通过暴露出去的方法或属性来访问
var BHX = {} ;BHX.Singleton = (function(){ // 添加自己的私有成员 var a1 = true ; var a2 = 10 ; var f1 = function(){ alert('f1'); }; var f2 = function(){ alert('f2'); }; // 把块级作用域里的执行结果赋值给单体对象 return { attr1: a1 , attr2: a2 , method1 : function(){ return f1(); }, method2 : function(){ return f2(); } } ;})();alert(BHX.Singleton.attr1);BHX.Singleton.method1();
对于上述闭包这种模式,如果私有的成员变量很多的话,只能被一次性加载,无法做到对其中某些变量只有用到的时候才会去加载。因此惰性单体模式可以有效解决这种问题
var Ext = {}; Ext.Base = (function() { // 私用变量 控制返回的单体对象 var uniqInstance; // undefined // 需要一个构造器 init 初始化单体对象的方法 function init() { // 私用成员变量 var a1 = 10; var a2 = true; var fn1 = function() { alert('fn1') }; var fn2 = function() { alert('fn2') }; return { attr1: a1, arrt2: a2, method1: function() { return fn1(); }, method2: function() { return fn2(); } }; } return { getInstance: function() { if (!uniqInstance) { //如果不存在 创建单体实例 uniqInstance = init(); } return uniqInstance; } }; })(); alert(Ext.Base.getInstance().attr1); Ext.Base.getInstance().method1();
对于这种模式,我们可以有很多个类似uniqInstance的变量来控制之后执行的init方法中需要被加载的变量及方法,只需要分别调用不同的getInstance来做多资源需要被调用的时候才会去加载
判断程序的分支 <浏览器差异的检测>
var Ext = {} ;var def = false ;Ext.More = (function(){ var objA = { // 火狐浏览器 内部的一些配置 attr1:'FF属性1' // 属性1 // 属性2 // 方法1 // 方法2 } ; var objB = { // IE浏览器 内部的一些配置 attr1:'IE属性1' // 属性1 // 属性2 // 方法1 // 方法2 } ; return (def) ?objA:objB;})();alert(Ext.More.attr1);
转载地址:http://kergi.baihongyu.com/