js设计模式之单例模式原理与用法详解

JS设计模式之单例模式原理与用法详解

前言

单例模式是一种常见的设计模式,在实际项目中也被广泛应用。在JavaScript中的应用也非常普遍,本文将详细讲解单例模式的原理及用法。

什么是单例模式

单例模式是一种只允许创建一个实例的模式。一般使用该模式的主要目的有以下两点:

  • 避免全局变量的污染
  • 保证对象只有一个实例,节约系统资源,提高代码效率

单例模式的实现

JavaScript中的单例模式实现非常简单,我们可以定义一个全局对象来存储单例实例。

1. 最简单的单例模式

最简单的单例模式就是定义一个全局对象,每次创建实例时先判断该全局对象是否已经有实例了,如果有则返回该实例,如果没有则创建新的实例并存储到全局对象中。

var singleton = {
    instance: null,
    getInstance: function() {
        if (!this.instance) {
            this.instance = {};
        }
        return this.instance;
    }
};

我们可以通过以下代码来使用该单例模式:

var instance1 = singleton.getInstance();
var instance2 = singleton.getInstance();
console.log(instance1 === instance2); // true

2. 单例模式与构造函数

上面的示例是基于一个单例对象来实现的,我们也可以使用构造函数来实现单例模式,只需要在构造函数中添加判断即可。

var Singleton = function() {
    if (Singleton.instance) {
        return Singleton.instance;
    }
    Singleton.instance = this;
};

var instance1 = new Singleton();
var instance2 = new Singleton();
console.log(instance1 === instance2); // true

3. 惰性单例模式

惰性单例模式指的是在需要的时候才创建对象实例。这主要是为了减少页面加载时不必要的资源浪费,只有当用户需要时才会加载相关资源。

我们可以通过以下代码来实现惰性单例模式:

var createInstance = function() {
    // 创建单例对象的代码
    return {};
};

var Singleton = (function() {
    var instance;
    return function() {
        if (!instance) {
            instance = createInstance();
        }
        return instance;
    }
})();

// 第一次调用时会创建实例
var instance1 = new Singleton();
// 第二次调用时不会再创建实例,而是返回之前创建的实例
var instance2 = new Singleton();
console.log(instance1 === instance2); // true

在上面的示例中,createInstance函数用来创建单例对象的代码,Singleton使用了闭包来存储单例对象实例。在第一次调用时会创建实例,以后调用时则直接返回之前创建的实例。

单例模式的应用场景

单例模式在实际项目中有一些典型的应用场景。

1. 页面登录框

在很多网站中都会使用登录框,由于登录框只需要有一个实例,因此可以使用单例模式来实现。

var loginBox = (function() {
    var box;
    return function() {
        if (!box) {
            box = document.createElement('div');
            box.innerHTML = '登录框';
            document.body.appendChild(box);
        }
        return box;
    };
})();

var btn = document.getElementById('show_login_box');
btn.onclick = function() {
    var box = loginBox();
    box.style.display = 'block';
};

在这个示例中,我们使用函数来创建一个登录框,由于只需要有一个实例,因此使用单例模式来实现。在第一次调用时,创建并添加登录框元素,以后调用时直接返回之前创建的元素。

2. 购物车实例

再举一个应用单例模式的例子:购物车实例。在一个网站中往往只需要一个购物车实例,因此可以使用单例模式来实现。

var ShoppingCart = (function() {
    var instance;
    var items = [];
    return function() {
        if (!instance) {
            instance = this;
        }
        instance.getItems = function() {
            return items;
        };
        return instance;
    };
})();

// 创建购物车实例
var cart1 = new ShoppingCart();
// 向购物车中添加商品
cart1.getItems().push({id: 1, name: '商品1', price: 10});
cart1.getItems().push({id: 2, name: '商品2', price: 20});

// 获取购物车实例
var cart2 = new ShoppingCart();

// cart2中的商品与cart1相同
console.log(cart2.getItems()); // [{id: 1, name: '商品1', price: 10}, {id: 2, name: '商品2', price: 20}]

总结

单例模式是一种非常常见的设计模式,在实际开发过程中也经常使用。没有一种单例模式是绝对正确的,每种实现方法都有优缺点,开发者需要根据实际场景来选择适合的单例模式实现。通过学习本文,您应该对单例模式有了更深入的理解。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:js设计模式之单例模式原理与用法详解 - Python技术站

(0)
上一篇 2023年5月27日
下一篇 2023年5月27日

相关文章

  • 全面解析jQuery $(document).ready()和JavaScript onload事件

    全面解析jQuery $(document).ready()和JavaScript onload事件 前言 在网页中,当html和css文件加载完成后,JavaScript就可以开始执行了。但是,由于JavaScript是在整个html文件加载完成之后才开始执行的,因此可能会导致某些JavaScript代码在html元素加载之前去操作它们的情况。 为了避免这…

    jquery 2023年5月28日
    00
  • jQuery中的选择器和过滤器()有什么区别

    在jQuery中,选择器和过滤器都是用于选择元素的工具,但它们之间有一些区别。本文将详细讲解jQuery中选择器和过滤器的区别,并提供两个示例,演示如何使用选择器和过滤器选择元素。 选择器 选择器是一种用于选择元素的表达式。在jQuery中,选择器使用美元符号($)和括号()来表示。以下是一个选择器的基本语法: $(selector) 在这个语法中,sele…

    jquery 2023年5月9日
    00
  • jquery+html5制作超酷的圆盘时钟表

    下面我将详细讲解“jquery+html5制作超酷的圆盘时钟表”的完整攻略,希望能够对您有所帮助。 一、准备工作 在你的html页面中引入jQuery库和相关的CSS文件。 “`html “` 在html页面中创建一个div,用于渲染时钟表的canvas元素。 “`html “` 确定时钟表的样式,例如大小、颜色等。 二、绘制画布 我们需要在canv…

    jquery 2023年5月28日
    00
  • jQWidgets jqxListBox indeterminateIndex()方法

    jQWidgets jqxListBox indeterminateIndex()方法详解 jQWidgets是一个基于jQuery的UI组件库,提供了丰富UI组件工具包。jqxListBox是其中之一。本文将详细介绍jqxListBox的indeterminateIndex()方法,包括定义、语法和示例。 indeterminateIndex()方法的定义…

    jquery 2023年5月10日
    00
  • jquery ajaxfileuplod 上传文件 essyui laoding 效果【防止重复上传文件】

    要实现“jquery ajaxfileuplod 上传文件 essyui laoding 效果【防止重复上传文件】”,我们需要以下几个步骤: 1. 引入必要的文件 为了使用jquery ajaxfileuplod和essyui,我们需要在页面中引入以下文件: <!– 引入jQuery库 –> <script src="http…

    jquery 2023年5月27日
    00
  • 原生javascript实现的分页插件pagenav

    下面我就为您详细讲解如何使用原生Javascript实现一个分页插件pagenav。 一、准备工作 在开始之前,我们需要准备以下工作: 在HTML文件中引入pagenav.css和pagenav.js文件。 准备一个HTML占位容器用于显示分页内容。 准备一个和后台返回数据对应的分页数据对象,其中包含当前页码、每页显示条数、数据总条数等信息。 二、编写分页h…

    jquery 2023年5月27日
    00
  • jQWidgets jqxScheduler touchScrollBarSize 属性

    jQWidgets是一个流行的JavaScript框架,提供了各种各样的UI组件,包括jqxScheduler,它是一个功能强大的事件日程表组件。jqxScheduler包含很多可以自定义的属性,其中一个是touchScrollBarSize属性。 touchScrollBarSize属性表示滚动条的大小,是用于触摸设备上的。在默认情况下,touchScro…

    jquery 2023年5月11日
    00
  • jQuery中的each()详细介绍(推荐)

    jQuery中的each()详细介绍(推荐) 一、介绍 jQuery库是使用最广泛的JavaScript库之一,提供了一个简单而强大的API,方便地操作DOM。其中,each()方法是jQuery中最常用的方法之一。它可以被用于遍历一个数组或者对象,类似于JavaScript的forEach()方法。 二、语法 $.each(collection, call…

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