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日

相关文章

  • 给js文件传参数(详解)

    下面是一份详细的“给js文件传参数(详解)”攻略。 什么是给JS文件传参数? 在网页开发中,经常需要使用 JavaScript 来完成各种交互效果和页面逻辑。而在这些 JavaScript 文件中,有时需要引用一些外部数据,比如页面的标题、用户输入的某些值等。这时候就需要通过给 JS 文件传递参数来实现。 通俗地说,就是将一些数据从网页传递给 JS 文件,让…

    JavaScript 2023年5月27日
    00
  • JavaScript window.setTimeout() 的详细用法

    JavaScript window.setTimeout() 的详细用法 在 JavaScript 中,window.setTimeout() 方法可以定时执行一个指定的代码块。它接收两个参数,分别是需要执行的代码块和执行时间(单位为毫秒)。 语法 window.setTimeout(code, delay); 其中,code 为需要执行的代码块;delay…

    JavaScript 2023年6月11日
    00
  • jQuery右下角旋转环状菜单特效代码

    要实现“jQuery右下角旋转环状菜单特效”,需要按以下步骤进行操作: 1. 引入jQuery库文件和相关CSS文件 <!DOCTYPE html> <html> <head> <title>Right bottom rotating menu</title> <meta charset=&q…

    JavaScript 2023年6月11日
    00
  • 详谈javascript中DOM的基本属性

    当谈到JavaScript中的DOM(文档对象模型)时,我们需要了解DOM的基本属性。DOM是指在HTML文档中的每个元素都可以视为一个对象,而JavaScript可以用来访问和修改它们。 HTML元素的基本属性 HTML元素的基本属性通常可以通过查询DOM文档来找到。下面是访问HTML元素的基本属性的一些示例。 Element.innerHTML Elem…

    JavaScript 2023年6月10日
    00
  • 基于Two.js实现星球环绕动画效果的示例

    以下是 “基于Two.js实现星球环绕动画效果的示例”的完整攻略: 1. Two.js简介 Two.js是一款轻量级的渲染工具库,可以轻松使用它来创建2d图形和动画。 2. 创建场景和画布 这个示例的第一步是使用Two.js创建一个场景和画布。 // 创建画布 var two = new Two({ fullscreen: true, autostart: …

    JavaScript 2023年6月11日
    00
  • 基于ES6作用域和解构赋值详解

    基于ES6作用域和解构赋值详解 作用域 Scope 作用域是程序代码中声明变量的区域。作用域可以分为全局作用域和局部作用域。 在ES6中,可以使用let和const声明变量,这两种声明方式都是块级作用域。 示例 1 // 全局作用域 let a = 1; function test() { // 局部作用域 let b = 2; console.log(a)…

    JavaScript 2023年6月11日
    00
  • 在JavaScript里嵌入大量字符串常量的实现方法

    在JavaScript中,我们通常会使用字符串常量来表示一些静态的文本信息,例如错误提示、确认提示等等。当我们需要处理大量的字符串常量时,如果直接在JavaScript文件中编写这些字符串,不仅容易造成代码混乱,而且不易维护。为了解决这个问题,我们可以将这些字符串常量存储在单独的文件中,再通过一些手段将其引入到JavaScript文件中,以下是实现方法的详细…

    JavaScript 2023年5月28日
    00
  • webpack output.library的16 种取值方法示例

    下面我将为你详细讲解关于“webpack output.library的16种取值方法示例”的完整攻略。 首先,我们需要了解output.library的含义。output.library是指将你的一些 JavaScript 代码打包到一个或多个库(library)中,使得其在浏览器环境或 Node.js 环境中能够被其他地方引用和使用。它的取值方式是一个字…

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