《JavaScript设计模式》读书笔记:单例模式

基础知识回顾

  • this 的指向

    • 直接属性(找得到的,找不到的就是window)
    • 间接属性(实例)
    • apply/call
  • this 的指向是根据函数运行的方式变化的,不是一定的

  • 作用域链

    活动对象 -- 函数定义处的环境 ...

  • 谁能访问活动对象中的变量?

    • 定义在其中的函数
  • 几种对象区分

    • 函数对象

    • 活动对象

      函数执行时创建,执行完毕后销毁;

      但如果活动对象里有对象被外部引用,则不会销毁。

  • 对象何时销毁:没有指针指向它的时候

  • 一个闭包包含

    • 函数对象
    • 函数对象的作用域链
  • 每个函数都有自己的作用域链

第四章内容

  • 用构造函数的属性存储实例

  • 或者用活动对象存储实例

    • 创建一个活动对象(存储实例)

    • 创建一个/多个函数对象,多次执行

  • 示例1

    var GetInstance = (function() {
    	var instance;
    
    	return function(html) {
    		if(instance) {
    			instance = 给实例赋值;
    		}
    
    		实例处理代码
    
    		return instance;
    	}
    })();
    

    效果就是 new 了两次,但是获得了同一个实例。

  • 示例2:改进

    引入代理类

    上述代码的缺点就是违背了单一职责原则,改进如下,将实例处理代码封装到Handler

    var GetInstance = (function() {
    	var instance;
    
    	return function() {
    		if(instance) {
    			instance = new Handler();
    		}
    
    		return instance;
    	}
    })();
    

    至于使用

    var a = new GetInstance();
    var a = new GetInstance();
    

    两个 new 并没有实际作用(因为没有用到this),更多的是象征的意义。

    new Handler() 其实也不是必须的。

  • 单例模式的核心:确保只有一个示例,并提供全局访问

    JS 中,实现很简单。用全局变量即可实现,如 var a = {};

    但为了减少全局变量污染,可以通过以下途径减少污染

    1、使用命名空间

    2、把变量封装到闭包内部,开放接口与外界通信,如定义在闭包里的函数。

  • 通用的惰性单例

    这个例子里包含三个对象:原始函数、中间函数、闭包的活动对象

    要搞清楚的几个问题。从原始函数出发思考。

    原始函数多次执行会产生多个实例,因此需要一个中间函数,多次执行中间函数只执行一次原始函数,且能存储实例。

    对中间函数的要求:

    1、执行时能够执行原始函数

    2、能够让原始函数的执行环境和中间函数保持一致,即需要 apply(this, arguments)

    3、能存储实例

    • 可以通过闭包
    • 可以通过其他方式存储
posted @ 2015-11-19 17:41  一扬  阅读(145)  评论(0编辑  收藏  举报