Javascript单例模式的介绍和实例

当我们开发一些复杂的web应用时,我们难免会需要创建一些全局预留变量或者共享某些对象,这时候单例模式就可以派上用场了。

什么是单例模式

首先,单例模式是一种创建型的设计模式。它实现了一个类只能够被创建一次的功能。简单来说,就是当某个类只需要一个实例时,就可以使用单例模式。

单例模式的实现

要实现单例模式,可以采用以下几种方式:

立即执行函数

立即执行函数是实现单例模式的最简单方法。

const singleton = (function() {
  let instance;
  function init() {
    // 单例代码
    return {
      publicMethod: function() {
        console.log('publicMethod');
      },
      publicProps: 'public props',
    };
  }
  return {
    getInstance: function() {
      if (!instance) {
        instance = init();
      }
      return instance;
    }
  }
})();

在立即执行函数中使用闭包来控制变量作用域,通过return返回一个包含getInstance方法的对象。在getInstance方法中实现判断是否已经有实例,如果有则返回实例,没有则创建实例并返回它。这样,在整个应用程序中只有一个实例。

ES6单例模式

ES6提供了class,可以通过class实现单例模式。

class Singleton {
  constructor() {
    if (!Singleton.instance) {
      Singleton.instance = this;
      // 单例代码
      this.publicProps = 'public props';
    }
    return Singleton.instance;
  }
  publicMethod() {
    console.log('publicMethod');
  }
}

Singleton类的构造函数中判断是否有实例,如果没有则创建实例并将实例赋值到Singleton.instance属性中,通过return Singleton.instance返回实例。

单例模式示例

管理弹窗

在web应用中,我们可能会使用弹窗来向用户显示一些信息。使用单例模式可以确保同一时间只有一个弹窗被显示。

const modal = (function() {
  let instance;
  function init() {
    let isOpen = false;
    const modal = document.createElement('div');
    modal.classList.add('modal');
    document.body.appendChild(modal);
    return {
      open: function() {
        if (!isOpen) {
          isOpen = true;
          modal.style.display = 'block';
        }
      },
      close: function() {
        if (isOpen) {
          isOpen = false;
          modal.style.display = 'none';
        }
      }
    };
  }
  return {
    getInstance: function() {
      if (!instance) {
        instance = init();
      }
      return instance;
    }
  };
})();

modal.getInstance().open(); // 打开弹窗

配置管理

在一些web应用中,我们需要读取一些公共配置,比如API地址、密钥等。使用单例模式可以提高效率,避免重复创建和读取配置文件。

const config = (function() {
  let instance;
  function init() {
    const data = {
      api: 'http://api.example.com',
      apiKey: 'your-api-key',
    };
    return {
      get: function(key) {
        return data[key] || '';
      },
      set: function(key, value) {
        data[key] = value;
      }
    };
  }
  return {
    getInstance: function() {
      if (!instance) {
        instance = init();
      }
      return instance;
    }
  };
})();

console.log(config.getInstance().get('api')); // http://api.example.com
config.getInstance().set('api', 'http://new-api.example.com');
console.log(config.getInstance().get('api')); // http://new-api.example.com

总结

以上就是Javascript单例模式的介绍和实例演示,单例模式可以确保同一时间只有一个实例存在,在开发中有很多的应用场景。立即执行函数和ES6类均可以实现单例模式。在实际开发中也可以根据项目需求进行定制。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Javascript单例模式的介绍和实例 - Python技术站

(0)
上一篇 2023年6月10日
下一篇 2023年6月10日

相关文章

  • php json中文编码为null的解决办法

    下面是详细的讲解: 问题描述 在PHP中,对于中文编码的JSON数据,在进行json_encode()时可能会出现某些中文字符串被编码为null的情况,这会导致JSON数据无法正常解析。如何解决这个问题呢? 解决办法 指定json_encode()函数的选项参数 我们可以在json_encode()函数的第二个参数中设置选项参数,如下所示: $data = …

    JavaScript 2023年6月1日
    00
  • JavaScript中SetInterval与setTimeout的用法详解

    JavaScript中SetInterval与setTimeout的用法详解 SetInterval 概念 setInterval()是JavaScript中的一个全局函数,用于创建一个可以重复执行的定时器。 语法 setInterval(func, delay, [param1, param2, …]); func:定时器每次运行时要调用的函数 del…

    JavaScript 2023年5月27日
    00
  • 老生常谈的跨域处理

    跨域处理是指浏览器限制页面从其他源加载资源的一种安全机制。例如,如果一个页面向外部的不同域名的接口发送Ajax请求获取数据,由于同源策略的限制,请求将会被浏览器拦截。 为了解决这个问题,我们需要采取一些跨域处理的方式。下面分别介绍几种跨域处理方案。 一、JSONP JSONP是通过动态添加<script>标签,以请求JSON数据的一种处理方式。由…

    JavaScript 2023年6月11日
    00
  • Mysql内储存JSON字符串根据条件进行查询

    MySQL中可以使用JSON值类型存储JSON格式的数据。而且MySQL也提供了一系列的JSON函数和操作符来方便地处理JSON值类型的数据。以下是使用MySQL内储存JSON字符串根据条件进行查询的步骤和实例说明。 步骤 创建一个表格 在MySQL数据库中,我们可以用如下语句创建一个表格: sql CREATE TABLE `students` ( `id…

    JavaScript 2023年6月11日
    00
  • js入门之Function函数的使用方法【新手必看】

    JS入门之Function函数的使用方法 什么是Function函数 在JavaScript中,函数是一种可重复使用的代码块,用于执行特定的任务。Function函数是最常用的一种函数类型,是一种可执行的JavaScript代码块,可以接受输入并返回输出。它通常被用于将代码结构化,使之易于阅读和维护。 Function函数的语法 function funct…

    JavaScript 2023年5月27日
    00
  • JS实现百度搜索框

    下面我来为你详细讲解 “JS实现百度搜索框”的攻略。 准备工作 在代码实现之前,我们需要先对百度搜索框的结构进行分析。可以发现,百度搜索框包含一段文本输入框和一个搜索按钮。在代码编写前,需要创建两个HTML元素分别代表文本输入框和搜索按钮,并设置相关属性。 <input type="text" name="search&q…

    JavaScript 2023年6月10日
    00
  • javascript asp教程错误处理

    接下来我将会给出一个完整的JavaScript ASP教程错误处理攻略,包含代码示例。 JavaScript ASP教程错误处理攻略 什么是错误处理? 在ASP中,错误处理是用于捕获和解决在代码运行时发生的错误和异常的技术。当您的代码出现错误时,错误处理将停止代码的执行, 并提供一些信息,比如错误类型、行号、错误描述等等,以方便调试和修复页面。 如何进行错误…

    JavaScript 2023年6月10日
    00
  • JavaScript中数组的排序、乱序和搜索实现代码

    下面是关于JavaScript中数组排序、乱序、搜索的完整攻略。 数组排序 sort()方法 sort()方法是 JavaScript 中的一个数组方法,用于对数组进行排序,该方法会改变原数组。sort()方法会将数组中的每个元素转化为字符串,然后通过比较它们的 Unicode 值(从左到右逐个比较对应的 ASCII 码值),来确定数组中元素的顺序。sort…

    JavaScript 2023年5月27日
    00
合作推广
合作推广
分享本页
返回顶部