单体模式(读书笔记)

这种模式在JavaScript中非常重要,也许比在其他任何语言中都更在重要。在网页上使用全局变量
有很大的风险,而用单体对象创建的命名空间则是清除这些全局变量的最佳手段之一。仅此一个原因你就
该掌握这种模式,更别说它还有许多别的用途。

1.单体的基本结构
定义:传统的定义,单体是一个只能被实例化一次并且可以通过一个众所周知的访问点访问的类;

    /*Basic Singleton*/

    var Singleton = {
        attribute1 : true,
        attribute2 : 10,

        method1 : function(){},
        method2 : function(arg){}
    }
在这个示例中,所有那些成员现在都可以通过变量Singleton来访问。
1.这个单体对象可以被修改,可以添加新成员,也可用delete运算符删除其现有成员。  
  -这实际上违背了面向对象设计的一条原则:类可以被扩展,但不应该被修改。
2.你可能还没有发觉这种单体对象与普通对象字面量有什么不同。严格的讲前面的例子所示的并不是
  一个单体,因为它不是一个可实例化的类。
3.广义的定义:单体式一个用来划分命名空间并将一批相关方法和属性组织在一起的对象,如果
  可以被实例化,那么它只能被实例化一次。
4.并非所有对象字面量都是单体。如果它只是用来模仿关联数组或容纳数据的话,那就显然不是
  单体。但如果它是用来组织一批相关方法和属性的话,那就可能是单体。

2.划分命名空间
1.单体对象有两个部分组成:包含着方法和属性成员的对象自身,以及用于访问它的变量。这个
变量通常是全局性的,以便在网页上任何地方都能直接访问到它所指向的单体对象。
2.命名空间是可靠的JavaScript编程的一个重要工具。在JavaScript中什么都可以被改写,程序员一不留神
就会擦出一个变量、函数甚至整个类,而自己去毫无察觉。

/*Declared globally*/
    function findProduct(id){……};
    ……
    //Later in your page,another programmer adds……
    var findProduct = $('find-product-button')//The findProduct function just got overwritten
--为了避免无意中改写变量,最好的解决办法之一是用单体对象将代码组织到命名空间中。
var myNamespace = {findProduct:function(){}}

3.用作特定网页专用代码的包装器的单体
1.在那种拥有许多网页的网站中,有些JavaScript代码是所有网页都要用到的,他们通常被存放在
独立的文件中;而有些代码则是某个网页专用的,不会被用到其他地方。最好把这两种代码分别
包装在自己的单体对象中。
2.var GiantCorp = window.GiantCorp || {};好处就是避免在你不知道的情况下重写了原来的GiantCorp;
4.拥有私用成员的单体
1.使用真正的私用方法的一个缺点在于它们比较耗费内存,因为每个实例都具有方法的一份新副本
不过,由于单体对象只会被实例化一次,因此为其定义真正的私用方法时不必顾虑内存方面的问题
。尽管如此,创建伪私用成员还是更容易一些。
2.在单体对象内创建私用成员最简单、最直接了当的办法是使用下划线表示法。这可以让其他程序
员知道相关方法或属性是私用的,只在对象内部使用。
2.使用闭包
1.在单体对象中创建私用成员的第二种办法需要借助闭包。

/*Single with Private Members,step 3.*/
    myNamespace.Singleton = (function(){

        //Private members
        var privateAttribute1 = false;
        var privateAttribute2 = [1,2,3];
        function privateMethod1(){}
        function privateMethod2(){}
      return {
        publicAttribute1 : true,
        publicAttribute2 : 10,
        publicMethod1 :function(){};    
        }
    })();
--这种单体模式又称模块模式,指的是它可以把一批相关方法和属性组织为模块并起到划分命名空间
的作用。
--这个包装函数创建了一个可以用来添加真正的私用成员的闭包。任何声明在这个匿名函数中的变量
或函数都只能被在同一个闭包中声明的其他函数访问。这个闭包在匿名函数执行结束后依然存在,所以
在其中声明的函数和变量总能从匿名函数所返回的对象内部(并且也只能从内部)访问。
--这种模式与使用下划线表示法的模式相比有几点优势。把私有成员放到闭包中可以确保其不会
在单体对象之外被使用。

5.惰性实例化
1.单体模式的各种实现方式有一个共同点:单体对象都是在脚本加载时被创建出来。合理的做法是
将实例化推迟到需要使用它的时候。这种技术被称为惰性加载。
6.分支
1.分支是一种用来把浏览器间的差异封装到在运行期间进行设置的动态方法中的技术。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值