• 《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、能存储实例

      • 可以通过闭包
      • 可以通过其他方式存储
  • 相关阅读:
    CGLib实现不同类中同名不同类型属性复制
    stream 伪复用实现
    年终盘点 | 2020年,国内私有云正式进入3.0时代
    高危端口135,137,138,139,445,1025,2475,3127,6129,3389,593
    在jsp引入js失败,提示404
    安全漏洞扫描
    Go 实现的文件行数统计工具
    .NET Core 获取域名 DNS 解析记录
    .NET Core 操作 Windows 注册表
    .NET MongoDb BsonDocument 序列化
  • 原文地址:https://www.cnblogs.com/yiyang/p/4978380.html
Copyright © 2020-2023  润新知