iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >如何使用Javascript实现单例模式
  • 936
分享到

如何使用Javascript实现单例模式

2023-06-14 20:06:07 936人浏览 八月长安
摘要

这篇文章给大家分享的是有关如何使用javascript实现单例模式的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。JavaScript是什么JavaScript是一种直译式的脚本语言,其解释器被称为JavaScri

这篇文章给大家分享的是有关如何使用javascript实现单例模式的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。

JavaScript是什么

JavaScript是一种直译式的脚本语言,其解释器被称为JavaScript引擎,是浏览器的一部分,JavaScript是被广泛用于客户端的脚本语言,最早是在html网页上使用,用来给HTML网页增加动态功能。

概述

单例模式也称为单体模式,规定一个类只有一个实例,并且提供可全局访问点;

在读这篇文章之前,也许你对单例模式的概念感到模糊或者不清楚,但是其实在日常的开发中你肯定用到过单例模式;

JavaScript中没有类的定义,单例模式的特点是”唯一“和”全局访问“,那么我们可以联想到JavaScript中的全局对象,利用es6的let不允许重复声明的特性,刚好符合这两个特点;是的,全局对象是最简单的单例模式;

let obj = {    name:"咸鱼",    getName:function(){}}

上述代码中可以知道obj就是一个单例,因为obj刚好就符合单例模式的两大特点:"唯一"和"可全局访问";

但是我们并不建议这么实现单例,因为全局对象/全局变量会有一些弊端:

污染命名空间(容易变量名冲突)维护时不容易管控 (搞不好就直接覆盖了)

代码实现

简单版单例模式

分析:只能有一个实例,所以我们需要使用if分支来判断,如果已经存在就直接返回,如果不存在就新建一个实例;

let Singleton = function(name){    this.name = name;    this.instance = null; }Singleton.prototype.getName = function(){    console.log(this.name);}Singleton.getInstance = function(name){    if(this.instace){        return this.instance;     }    return this.instance = new Singleton(name);}let winner = Singleton.getInstance("winner");   //winnerconsole.log(winner.getName());let sunner = Singleton.getInstance("sunner");   //winnerconsole.log(sunner.getName())

上面代码中我们是通过一个变量instance的值来进行判断是否已存在实例,如果存在就直接返回this.instance,如果不存在,就新建实例并赋值给instance;

但是上面的代码还是存在问题,因为创建对象的操作和判断实例的操作耦合在一起,并不符合”单一职责原则“;

改良版

思路:通过一个闭包,来实现判断实例的操作;

闭包警告:不理解闭包的同学请先学习闭包

let CreateSingleton = (function(){    let instance = null;    return function(name){        this.name = name;        if(instance){            return instance        }        return instance = this;    }})()CreateSingleton.prototype.getName = function(){        console.log(this.name);}let winner = new CreateSingleton("winner");  //winnerconsole.log(winner.getName());let sunner = new CreateSingleton("sunner");  //winnerconsole.log(sunner.getName())

代理版单例模式

通过代理的形式,将创建对象的操作和实例判断的操作进行解耦拆分,实现更小粒度的划分,符合”单一职责原则“;

let ProxyCreateSingleton = (function(){    let instance = null;    return function(name){        if(instance){            return instance        }        return instance = new Singlton(name);    }})();let Singlton = function(name){    this.name = name;} Singlton.prototype.getName = function(){    console.log(this.name);}let winner = new ProxyCreateSingleton("winner");console.log(winner.getName());let sunner = new ProxyCreateSingleton("sunner");console.log(sunner.getName());

上面的代码中,ProxyCreateSingleton()只负责判断实例,Singlton只负责创建对象和赋值;

惰性单例模式

我们经常会有这样的场景:页面多次调用都有弹窗提示,只是提示内容不一样;

这个时候我们可以立马想到是单例模式,弹窗就是单例实例,提示内容是参数传递;我们可以用惰性单例模式来实现它;

<!DOCTYPE html><html lang="en"><head>    <meta charset="UTF-8">    <meta name="viewport" content="width=device-width, initial-scale=1.0">    <meta Http-equiv="X-UA-Compatible" content="ie=edge">    <title>Document</title></head><body>    <div id="loginBtn">有梦想的咸鱼</div></body><script>let getSingleton = function(fn) {    var result;    return function() {        return result || (result = fn.apply(this, arguments)); // 确定this上下文并传递参数    }}let createAlertMessage = function(html) {    var div = document.createElement('div');    div.innerHTML = html;    div.style.display = 'none';    document.body.appendChild(div);    return div;}let createSingleAlertMessage = getSingleton(createAlertMessage);    document.getElementById('loginBtn').onclick=function(){        let alertMessage = createSingleAlertMessage('看来真的是个咸鱼');        alertMessage.style.display = 'block';    }</script></html>

惰性单例是指的是页面开始加载的时候我们的实例是没有进行创建的,是当我们点击页面的div之后才开始创建实例(按需创建),这可以提高我们的网页性能,加快我们的页面渲染速度;

感谢各位的阅读!关于“如何使用Javascript实现单例模式”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,让大家可以学到更多知识,如果觉得文章不错,可以把它分享出去让更多的人看到吧!

--结束END--

本文标题: 如何使用Javascript实现单例模式

本文链接: https://www.lsjlt.com/news/274844.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • c++中函数返回值的类型是由什么决定的
    在 c++ 中,函数返回值类型由其函数原型的类型决定,包括:函数原型指定返回值类型:在函数名称后跟冒号,再跟返回值类型。默认返回值类型为 int:如果不指定返回值类型,默认类型为 int...
    99+
    2024-05-14
    c++
  • 在c++中,什么叫函数的返回值
    在 c++ 中,函数只能返回一个值。解决方法:引用传递、结构体或类、out 参数。没有返回值的函数可以使用 void 类型,表示不返回任何值。 什么是 C++ 中函数的返回值? 在 C...
    99+
    2024-05-14
    c++
  • c++中static的作用和用法
    c++ 中的 static 关键字用于声明静态变量、函数或类成员,使其在程序生命周期内存在或与类的每个实例关联。具体用法如下:静态变量:在函数外声明,仅创建一份副本,在程序启动时初始化且...
    99+
    2024-05-14
    c++
  • static在c和c++中的区别
    static关键字在c和c++中用于控制变量的生命周期和作用域。在c中,它延长局部变量和限制全局变量的作用域。在c++中,它还用于定义类成员变量和函数、命名空间中的变量和函数,以及函数内...
    99+
    2024-05-14
    c语言 c++ 作用域
  • c++中a++与++a的区别
    c++ 中 a++ 和 ++a 区别:后缀递增 a++ 先返回原始值,再递增;前缀递增 ++a 先递增,再返回递增后的值。 C++ 中 a++ 与 ++a 的区别 在 C++ 中,a+...
    99+
    2024-05-14
    c++
  • if else在c++中的用法
    在 c++ 中,if else 语句根据条件执行不同代码块的语法为:if (condition) { } else { }。它可用于:检查数字是否为正数根据条件执行嵌套 if els...
    99+
    2024-05-14
    c++
  • struct在c和c++中的区别
    c和c++中struct的区别包括:c中成员默认公开访问,c++中默认私有访问。c++可以在struct定义中初始化成员,c中不允许。c++支持成员函数,c不支持。c++不支持匿名str...
    99+
    2024-05-14
    c++
  • c++中的所有函数都是传值调用吗
    函数调用类型可分为传值调用和引用调用,默认采用传值调用,传值调用中形参接收实参副本,引用调用中形参接收实参引用,对形参进行的修改也会影响实参。 C++中的函数调用类型 C++中,函数调...
    99+
    2024-05-14
    c++
  • c++中ifdef的用法
    c++ 中的 #ifdef 预处理器指令用于根据预定义宏是否存在来编译或不编译代码块。它的语法是 #ifdef ,其作用包括:检查宏是否存在,如果宏已定义,则编译其后的代码块;实现条件编...
    99+
    2024-05-14
    c++
  • c++中的函数调用有哪几种方式?它们有什么区别
    c++ 中的函数调用方式有 4 种:值传递(复制实参值,不影响实参)、引用传递(传递实参地址,修改形参值会修改实参)、指针传递(传递实参指向的内存地址,修改指向的值会影响实参)、rval...
    99+
    2024-05-14
    c++
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作