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日

相关文章

  • jQWidgets jqxComboBox scrollBarSize 属性

    以下是关于“jQWidgets jqxComboBox scrollBarSize 属性”的完整攻略,包含两个示例说明: 简介 jqxComboBox 控件提供了 scrollBarSize 属性,该用于设置拉列表的滚动条大小。通过使用 scrollBarSize 属性我们可以控制下拉列表的滚动条大小以便更好适应不同的屏幕分辨率和操作系统。 详细攻略 是 j…

    jquery 2023年5月11日
    00
  • jQWidgets jqxExpander collapse()方法

    jQWidgets jqxExpander collapse()方法 jQWidgets是一个基于jQuery的UI组件库,提供了丰富的UI组件和工具包括表格、下拉等。jqxExpander是jQWidgets的组件之一,用于创建可折叠的面板。collapse()方法是jqxExpander的一个方法,用于折叠面板。 collapse()方法的基本语法 co…

    jquery 2023年5月9日
    00
  • jQWidgets jqxDataTable beginCellEdit()方法

    以下是关于“jQWidgets jqxDataTable beginCellEdit()方法”的完整攻略,包含两个示例说明: 简介 beginCellEdit() 方法是 jqxDataTable 控件的一个方法,用于开始编辑单元格。 攻略 以下是 jqxDataTable 控件的 beginCellEdit() 方法的完整攻略: 开始编辑单元格 在 jqx…

    jquery 2023年5月11日
    00
  • JQuery parseXML()方法

    jQuery.parseXML()方法用于将XML字符串解析为XML文档对象。本文将详细介绍parseXML()方法的语法和用法,并提供两个示例说明。 语法 以下是parseXML()方法基本语法: jQuery.parseXML(xml) 在这个语法中,xml是解析的XML字符串parseXML()方法将返回一个XML文档对象。 示例1:解析XML字符串 …

    jquery 2023年5月9日
    00
  • 如何使用jQuery获取特定选项标签的文本

    获取特定选项标签的文本可以使用jQuery中的.text()方法。 首先,需要确定要获取文本的特定选项标签,可以使用CSS选择器来选择目标元素,例如: // 选择id为option1的选项标签,并获取其文本 var option1text = $(‘#option1’).text(); 第二个示例,如果要获取一组选项的文本,可以使用.each()方法遍历每个…

    jquery 2023年5月12日
    00
  • Thinkphp5框架中引入Markdown编辑器操作示例

    让我为您详细讲解ThinkPHP5框架中引入Markdown编辑器的操作示例。 1. Markdown编辑器功能介绍 Markdown 编辑器是一种轻量级的文本编辑器,它能够将纯文本编写的内容转换为 HTML 格式的内容。ThinkPHP5框架中,我们可以通过引入第三方 Markdown 编辑器实现在网站上进行 Markdown 编辑的功能。 2. 引入Ma…

    jquery 2023年5月27日
    00
  • jquery $.each 和for怎么跳出循环终止本次循环

    对于jquery中的 $.each 和原生的for循环,跳出循环或者终止本次循环的方法略有不同。 1. jquery $.each $.each 是jquery中用于遍历数组和对象的方法,它的基本用法如下: $.each(arrayOrObject, function(index, value){ // 条目处理逻辑 }); 其中,arrayOrObject…

    jquery 2023年5月28日
    00
  • jQWidgets jqxTree expandItem()方法

    以下是关于 jQWidgets jqxTree 组件中 expandItem() 方法的详细攻略。 jQWidgets jqxTree expandItem() 方法 expandItem() 方法用于展开 jQWidgets jqxTree 组件中的节点。如果节点已经展开,该方法将不执行任何操作。 语法 $(‘#tree’).jqxTree(‘expand…

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