zoukankan      html  css  js  c++  java
  • js21---单体(单例)模式

    <!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>
  • 相关阅读:
    Apache Pig的前世今生
    openssl之EVP系列之6---EVP_Encrypt系列函数编程架构及样例
    P3388 【模板】割点(割顶)
    让priority_queue支持小根堆的几种方法
    2017.11.7解题报告
    一个例子教你如何与出题人斗智斗勇
    debug
    树上倍增求LCA及例题
    素数的筛法
    Catalan卡特兰数入门
  • 原文地址:https://www.cnblogs.com/yaowen/p/6879939.html
Copyright © 2011-2022 走看看