• [设计模式]单体模式


    Javascript中的单体模式是常用的模式,也是最基本的一种模式。先说说有哪些优点,当然不止有两个优点,呵呵。
    通常我们定义的函数或变量都会是在全局里,当然,把变量写在函数里并用var去定义的话,固然这个变量的作用域是在这个函数里面。
    单体模式的优点是:
    1、可以减少变量冲突,当然闭包也可以实现这点。
    2、把功能代码都组织在一起,方便阅读和维护。
    3、可以有更好的分支处理。

    下面先来一段单体模式代码

    //这是一个单体模式示例,就拿近期的项目来说明
    //
    呵呵,看下面的变量名,认识我的人,都知道是哪个项目啦。那项目就是用了单体模式。
    var XZB = {
    namespace:function(){

    },
    copyText:function(){

    },
    method1:function(){
    }

    ....
    }

    这样XZB对象下面的变量就不会和全局变量发生冲突了,可以通过XZB[method1]来访问里面的方法。
    也许有人问,var XZB这个不是在全局变量吗?不怕有冲突吗?呵呵,当然,这个唯一的保护层是很坚固,但也是很脆弱的。
    所以在全局定义XZB之前,要判断一下全局有木有同名变量。

    if(typeof XZB == "undefined") XZB = {};

    单体模式里面的方法都是公有的,也就是说,可以通过XZB[method1]来访问里面的method1的方法。
    但也有缺点,就是可以通过XZB[method1]=null 来KO一个方法,呵呵。
    那么,有木有方法可以做到只公开一小部分方法呢?有,就是用闭包的方法:

    var XZB = (function(){
    var G = 10;
    var Return = {
    getG:function(){
    return G;
    },
    setG:function(g){
    G = g;
    }
    }
    return Return;
    })();

    这样通过闭包自执行返回一个可公开的方法,这样只能访问和修改公开的变量了,即里面的getG和setG。
    测试一下:

    console.log(XZB.getG());  //10
    XZB.setG(15);
    console.log(XZB.getG()); //15
    console.log(XZB.G) //G是闭包里面的私有变量,无法访问。


    引:
    如果先有以下:

    var XZB = {
    a:"123"
    }

    如果想要再加一个b:"456",

    //往XZB追加b
    XZB.b = "456";

    console.log(XZB); //XZB = {a:"123",b:"456"}

    注意以下的写法是错误的

    //以下是错误的写法
    XZB = {b:"456"}

    console.log(XZB.a) //undefiend

    因为这样就会给XZB重新开辟一个新的内存空间,也就是说,之前的a:"123"木有了。

    一般在单体模式中按功能划分,比如:

    var XZB = {
    arrayMethod:{
    indexOf:function(i){//获取数组元素索引},
    getEle:function(i){//获取指定索引的元素}
    },
    stringMethod:{
    sliceString:function(m,n){//截取某字符串},
    stringLen:function(string){//返回字符串长度}
    }
    }






  • 相关阅读:
    扯一下关于魔兽改键的蛋
    Emacs23.3在ubuntu10.10下的手动编译与安装
    GRUB2英文文档的部分翻译
    WinForm中Crossthread operation not valid错误的解决方法
    C# 嵌入式资源
    raster配准
    excel vba 玫瑰图 风速 风向
    使用UserControl好处
    How does ArcSDE use Oracle Spatial? arcsde怎么使用oracle spatial
    信息抽取的定义(definition of information extraction)
  • 原文地址:https://www.cnblogs.com/zzbo/p/2349588.html
Copyright © 2020-2023  润新知