<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>Untitled Document</title> <script type=text/javascript charset=utf-8> /* 单体 简单单体 闭包单体 惰性单体 分支单体 */ // 1 简单单体模式(单例模式),不能new了,用于全局资源,公共数据。 var Singleton = { attr1: true , attr2: 10 , method1 : function(){ alert('我是方法1'); }, method2 : function(){ alert('我是方法2'); } }; alert(Singleton.attr1); // 补充 :划分命名空间 (区分代码),大对象.小对象, Ext.Manager.attr1 / method1 var BHX = {}; BHX.Singleton = {//json里面不用this和var, attr1: true , attr2: 10 , method1 : function(){ alert('我是方法1'); }, method2 : function(){ alert('我是方法2'); } }; BHX.Singleton.method1(); // 2 上面Singleton里面的属性还是可以更改。借用闭包保护数据 var BHX = {} ; BHX.Singleton = (function(){//(function(){})() // 添加自己的私有成员 var a1 = true ; var a2 = 10 ; var f1 = function(){ alert('f1'); } var f2 = function(){ alert('f2'); } // 把块级作用域里的执行结果赋值类我的单体对象 return { //返回要执行才return attr1: a1 , attr2: a2 , method1 : function(){ return f1(); }, method2 : function(){ return f2(); } } ; })();//Singleton = {attr1: a1 ,attr2: a2 ,method1 :method2 : } alert(BHX.Singleton.attr1);//改变Singleton不会改变var a1,a2 BHX.Singleton.method1(); </script> </head> <body> </body> </html>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>Untitled Document</title> <script type=text/javascript charset=utf8> // 惰性单体(和闭包单体有一些相似的地方) // 命名空间 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 {//不像之前的,代码一执行,Base就有了很多属性,这里只有一个方法。 getInstance : function(){//只有Base调用了方法才返回很多属性, if(!uniqInstance){ //每次返回同一个对象,不加判断就返回不是同一个对象, uniqInstance = init(); } return uniqInstance ; } }; })(); alert(Ext.Base.getInstance().attr1); Ext.Base.getInstance().method1(); // 分支单体 (判断程序的分支 <浏览器差异的检测>) 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); </script> </head> <body> </body> </html>