zoukankan      html  css  js  c++  java
  • javascript的单例模式

    单例模式(Singleton),整个运行期间只会被初始化一次。该模式简单易懂,运用也很广泛。可以用它来聚合公共的方法,形成一个工具类,对外提供api。

    1. 单例模式的基本结构

        var Singleton = {

            attr1: 'test1',

            attr2: 10,

            method: function(){

            ...

            },

            ...

        }

        这就是一个单例对象,Singleton是全局变量,js载入时被初始化一次。

        jquery就是一个很大的单例  (function(){var jquery=(function(){})();window.jQuery = window.$ = jQuery;})(window); 

    2. 拥有私有变量的单例模式

        jascript的对象在运行期间是可以直接修改的,也没有其他面向对象语言的private等关键字。一些方法又不想被外面直接调用或者修改。

        2.1 私有方法命名方法 _getName,方法名称前加下划线,约定此类方法或变量为私有

            var Singleton = {

                _value: '23s',

                _stringSplit: function(str, delimeter){...},

            }

        2.2 闭包

            var Singleton = (function(){

                var titileId = "rules";

                function closePanel(id){

                    ....

                }

                return {

                    publicAttr: 1,

                    publicMethod: function(){

                        closePanel(this.publicAttr);

                    }

               }

            })();

            titleId属性和closePanle因为在闭包内部,所有成了私有变量,外部不可访问和修改。

            titleId属性声明的时候必须加var关键字,不然就变成一个全局变量。

    3. lazy初始化

        由于单例对象一直存在内存之中,如果比较大的实例,一开始就初始化,代价比较高,可以等到需要的时候再初始化

        var Singleton = (function(){

            var uniqueInstance;

            function constructor(){

                var privateAttr = "";

                function privateMethod(){}

                return {}

            }

            return {

                getInstance: function(){

                    if(!uniqueInstance){

                        uniqueInstance = new constructor();

                    }

                    return uniqueInstance;

                }

           }

        })();

    4. 命名空间

        一个页面会载入多个js,全局变量和方法会有冲突或覆盖的风险。把变量和方法都放到一个单例对象下面,避免冲突。

        var MyNamespace = {

           

        }

        一个创建命名空间的方法

        function createNameSpace(spaceStr){
            var space = spaceStr.split(".");
            var parent = window, name = "";
            for(var i = 0; i < space.length; i++){
                name = space[i];
                parent = parent[name] = parent[name] || {};
            }
        }

  • 相关阅读:
    linux之卸载软件
    linux之挂载硬盘
    windows MySQL 5+ 服务手动安装
    深刻理解Python中的元类(metaclass)
    Python_cmd的各种实现方法及优劣(subprocess.Popen, os.system和commands.getstatusoutput)
    WSGI、flup、fastcgi、web.py的关系
    Windows下python环境变量配置
    External file changes sync may be slow: Project files cannot be watched (are they under network mount?)
    as。 对象和数组
    为什么for不能有序遍历数组的所有元素?(Array的设计原理)
  • 原文地址:https://www.cnblogs.com/oceanxing/p/2869611.html
Copyright © 2011-2022 走看看