Javascript单例模式的介绍和实例

yizhihongxing

当我们开发一些复杂的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日

相关文章

  • JavaScript中valueOf函数与toString方法深入理解

    JavaScript中valueOf函数与toString方法深入理解 JavaScript中的对象可以通过自身的函数或方法转换为原始值。其中,valueOf函数和toString方法都可以用来实现此目的。本文将深入探讨valueOf函数与toString方法的区别、使用场景、如何自定义和优先级等问题,并通过示例说明它们的使用方法。 区别 valueOf v…

    JavaScript 2023年5月27日
    00
  • JS中call apply bind函数手写实现demo

    下面是关于“JS中call apply bind函数手写实现demo”的攻略: 理解call、apply、bind函数 在手写这三个函数的过程中,我们必须先清楚地理解这三个函数的作用: call函数:调用一个函数,将一个对象作为第一个参数,以及多个参数传入该函数。 apply函数:调用一个函数,将一个对象作为第一个参数,以及一个参数数组传入该函数。 bind…

    JavaScript 2023年6月10日
    00
  • 原生JS查找元素的方法(推荐)

    原生JS查找元素的方法(推荐) 在前端开发中,我们经常需要对页面中的元素进行操纵和操作,因此查找元素的能力显得尤为重要。下面是一些原生JS查找元素的方法,推荐使用这些方法来获取页面中的元素。 1. getElementById方法 getElementById方法可以根据DOM元素的id属性来获取一个元素。下面是一个示例: var myElement = d…

    JavaScript 2023年6月10日
    00
  • js同源策略详解

    JS同源策略详解:什么是同源? 在网站开发中,我们常常会遇到 JS 同源策略,那么什么是同源?为什么同源策略这么重要?这篇文章将为你一一解答。 同源(Same-origin)是由同一个协议(protocol)、主机名(host)和端口号(port)组成,若三者相同,则是同源。例如: https://www.example.com 和 https://www.…

    JavaScript 2023年6月11日
    00
  • JS数组扁平化、去重、排序操作实例详解

    JS数组扁平化、去重、排序操作实例详解 在JS编程中,经常需要对数组进行处理,比如将一个多维数组“扁平化”成一维数组、去掉数组中的重复元素、按照一定规则排序等操作。本文将介绍如何在JS中实现数组的扁平化、去重和排序操作,并给出相应的代码示例。 JS数组扁平化 所谓的数组扁平化,就是将一个嵌套多层的数组变成一个一维数组。比如: const arr = [1, …

    JavaScript 2023年5月27日
    00
  • JavaScript输出所选择起始与结束日期的方法

    请看下面的详细讲解。 JavaScript输出所选择起始与结束日期的方法 在JavaScript中,我们可以利用Date对象来表示日期和时间。日期可以是任何格式的文本,而时间则以毫秒计算自1970年1月1日午夜起的时间戳。 在本文中,我们将讨论如何输出所选择的起始和结束日期。 1. 获取所选择的日期 为了获取用户选择的日期,我们可以使用JavaScript内…

    JavaScript 2023年5月27日
    00
  • Javascript 更新 JavaScript 数组的 uniq 方法

    下面是更新 JavaScript 数组的 uniq 方法的完整攻略: 1. 现状 目前,虽然 JavaScript 数组已有现成的 filter 函数可以用来过滤数组中重复的元素,但很多开发者经常需要自定义数组的 uniq 方法,以实现更加灵活的去重操作。目前,常见的去重实现方式有两种:基于 Set 对象的去重和基于对象属性的去重,其中基于 Set 的去重是…

    JavaScript 2023年5月27日
    00
  • 深入学习JavaScript中的bom

    下面是深入学习JavaScript中的BOM的完整攻略。 一、BOM是什么 BOM(Browser Object Model,浏览器对象模型)是指浏览器端的JavaScript API,它提供了访问和操作浏览器窗口的对象和方法。BOM包含了很多有用的对象和方法,例如: Window对象:代表浏览器的窗口,它是BOM的核心对象。 Location对象:提供了对…

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