iis服务器助手广告广告
返回顶部
首页 > 资讯 > 前端开发 > JavaScript >JS实现单例模式的6种方案汇总
  • 479
分享到

JS实现单例模式的6种方案汇总

2024-04-02 19:04:59 479人浏览 八月长安
摘要

前言 今天在复习设计模式中的-创建型模式,发现js实现单例模式的方案有很多种,稍加总结了一下,列出了如下的6种方式与大家分享 大体上将内容分为了ES5(Function)与es6(C

前言

今天在复习设计模式中的-创建型模式,发现js实现单例模式的方案有很多种,稍加总结了一下,列出了如下的6种方式与大家分享

大体上将内容分为了ES5(Function)与es6(Class)实现两种部分

单例模式的概念

单例模式就是在系统中保存一个实例,就是一个全局变量,在团队开发中,为了实现一些相似的功能,比如不同页面之间的表单验证,可能需求是不一样的,但是呢命名可能一样,这时就会产生冲突,这时候单例模式就能很好的解决这个问题。

  • 一个实例只生产一次
  • 保证一个类仅有一个实例,并提供一个访问它的全局访问点

说说它的优点:

1,单例模式声明一个命名空间,它生成一个唯一的全局变量,一个命名空间,可以用声明对象的方式来声明:

var mapleTao={ name:"mapleTao",init:function(){console.log(this.name)}};

有木有发现这个和对象有点类似呢,其实name,init是它的属性,通过mapleTao.name就获取它name的值,通过mapleTao.init()就可以调用init方法,这样在哎处理多需求页面,多人开发时就能很好的解决命名冲突的问题,以及可以更好的维护代码,更好的控制代码。

2,单例模式在全局中只声明一个变量,大家都知道在js中,假设你写了一个方法,如 function aa(){},这样就会在window中生成一个叫aa的变量,当实现一个功能时,在代码封装中,会创建好多函数,好多function,这样就会在window中创建好多变量,会占用更多的内存单元,全局变量的作用域很广,在众多处理函数中都可能改变,这样当出现bug时不容易快速找到,而通过单例模式创建的对象变量中可以更快速的找到问题,从而解决,这大大减少的问题修复的时间以及系统加载的时间。

3.在实现同一个功能的地方比通过new新创建对象对内存对资源的占用更据优势。

方式1

利用instanceof判断是否使用new关键字调用函数进行对象的实例化


function User() {
    if (!(this instanceof User)) {
        return
    }
    if (!User._instance) {
        this.name = '无名'
        User._instance = this
    }
    return User._instance
}

const u1 = new User()
const u2 = new User()

console.log(u1===u2);// true

方式2

在函数上直接添加方法属性调用生成实例


function User(){
    this.name = '无名'
}
User.getInstance = function(){
    if(!User._instance){
        User._instance = new User()
    }
    return User._instance
}

const u1 = User.getInstance()
const u2 = User.getInstance()

console.log(u1===u2);

方式3

使用闭包,改进方式2


function User() {
    this.name = '无名'
}
User.getInstance = (function () {
    var instance
    return function () {
        if (!instance) {
            instance = new User()
        }
        return instance
    }
})()

const u1 = User.getInstance()
const u2 = User.getInstance()

console.log(u1 === u2);

方式4

使用包装对象结合闭包的形式实现


const User = (function () {
    function _user() {
        this.name = 'xm'
    }
    return function () {
        if (!_user.instance) {
            _user.instance = new _user()
        }
        return _user.instance
    }
})()

const u1 = new User()
const u2 = new User()

console.log(u1 === u2); // true

当然这里可以将闭包部分的代码单独封装为一个函数

在频繁使用到单例的情况下,推荐使用类似此方法的方案,当然内部实现可以采用上述任意一种


function SingleWrapper(cons) {
    // 排除非函数与箭头函数
    if (!(cons instanceof Function) || !cons.prototype) {
        throw new Error('不是合法的构造函数')
    }
    var instance
    return function () {
        if (!instance) {
            instance = new cons()
        }
        return instance
    }
}

function User(){
    this.name = 'xm'
}
const SingleUser = SingleWrapper(User)
const u1 = new SingleUser()
const u2 = new SingleUser()
console.log(u1 === u2);

方式5

在构造函数中利用new.target判断是否使用new关键字


class User{
    constructor(){
        if(new.target !== User){
            return
        }
        if(!User._instance){
            this.name = 'xm'
            User._instance = this
        }
        return User._instance
    }
}

const u1 = new User()
const u2 = new User()
console.log(u1 === u2);

方式6

使用static静态方法


class User {
    constructor() {
        this.name = 'xm'
    }
    static getInstance() {
        if (!User._instance) {
            User._instance = new User()
        }
        return User._instance
    }
}


const u1 = User.getInstance()
const u2 = User.getInstance()

console.log(u1 === u2);

总结

到此这篇关于JS实现单例模式的文章就介绍到这了,更多相关JS单例模式内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: JS实现单例模式的6种方案汇总

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

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

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

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

下载Word文档
猜你喜欢
  • JS实现单例模式的6种方案汇总
    前言 今天在复习设计模式中的-创建型模式,发现JS实现单例模式的方案有很多种,稍加总结了一下,列出了如下的6种方式与大家分享 大体上将内容分为了ES5(Function)与ES6(C...
    99+
    2024-04-02
  • JS实现单例模式的N种方案
    目录JS实现单例模式的多种方案单例模式的概念方式1方式2方式3方式4方式5方式6JS实现单例模式的多种方案 ,本文稍加总结,列出了6种方式与大家分享,大体上将内容分为了ES5(Fun...
    99+
    2024-04-02
  • Java单例模式的6种实现方式详解
    目录为什么使用单例模式使用单例模式需要注意的关键点单例模式的几种写法1. 饿汉式2. 懒汉式3. DCL(Double CheckLock)实现单例4. 静态内部类5...
    99+
    2024-04-02
  • C#实现单例模式的6种方法小结
    目录介绍Version 1 - 非线程安全Version 2 - 简单的线程安全Version 3 - Double-check locking的线程安全Version 4 - 不完...
    99+
    2024-04-02
  • JS中的6种打断点的方式实例总结
    目录前言普通断点条件断点DOM 断点URL 断点Event Listener 断点异常断点总结前言 Debugger 是前端开发很重要的一个工具,它可以在我们关心的代码处断住,通过单...
    99+
    2024-04-02
  • JS异步编程方法的6种方案总结
    目录前言:一、回调函数二、事件监听三、发布/订阅四、Promises对象五、生成器函数 Generator/yield六、async/await 函数的实现总结:前言: javasc...
    99+
    2023-01-31
    js异步编程方法有哪些 js 异步方法 js异步机制
  • Android 单例模式的四种实现方式
    目录一.饿汉式二.懒汉式三.双重检查加锁方式四.静态内部类方式总结一.饿汉式 public class SingletionStarving { private sta...
    99+
    2024-04-02
  • Java单例模式的五种实现方式
    目录前言饿汉单例懒汉单例非线程安全的懒汉单例加同步锁的懒汉单例双重检验懒汉单例静态内部类静态内部类为什么是线程安全总结前言 单例模式(Singleton Pattern)是 Java...
    99+
    2024-04-02
  • C#实现单例模式的多种方式
    什么是单例模式 这里我就不做过多的解释了, 毕竟关于Singleton的资料实在是太多太多了。点击这里 简单的思路就是, 创建对象单例的动作转移到另外的行为上面, 利用一个行为去创建...
    99+
    2024-04-02
  • Python实现单例模式的五种写法总结
    目录使用模块使用装饰器基于 __new__ 方法实现基于 metaclass 方式实现单例模式(Singleton Pattern) 是一种常用的软件设计模式,该模式的主要目的是确保...
    99+
    2024-04-02
  • js中常见的6种继承方式总结
    目录前言1、原型继承2、盗用构造函数3、组合继承4、原型式继承5、寄生式继承6、寄生式组合继承总结前言 js是门灵活的语言,实现一种功能往往有多种做法,ECMAScript没有明确的...
    99+
    2024-04-02
  • vue实现单点登录的方式汇总
    最近项目停工了,RageFrame的学习暂时告一段落,这一篇给大家分享下有关单点登录的相关知识,并提供一些demo给大家参考,希望对想了解的朋友有一些帮助。 话不多说,先上原理(借...
    99+
    2024-04-02
  • Python实现单例模式的四种方式详解
    简介:单例模式可以保证一个类仅有一个实例,并提供一个访问它的全局访问点。适用性于当类只能有一个实例而且客户可以从一个众所周知的访问点访问它,例如访问数据库、MQ等。 实现方式: 1、...
    99+
    2024-04-02
  • Android富文本实现的几种方式汇总
    目录Android富文本的实现的几种方式一,Html的方式实现1.1 占位符的处理1.2 Html的占位符1.3 自定义Html标签二,Span的几种实现方式2.1 java - S...
    99+
    2024-04-02
  • Docker之实现挂载的三种方式汇总
    目录Docker实现挂载的方式一、通过docker run命令二、通过dockerfile创建挂载点三、容器共享卷(挂载点)四、最佳实践:数据容器关于Docker中挂载的解释总结Do...
    99+
    2023-02-25
    Docker挂载 Docker实现挂载 Docker挂载方式
  • Python 中用多种方式实现单例模式
    目录使用模块使用装饰器使用类基于 __new__ 方法实现基于 metaclass 方式实现单例模式(Singleton Pattern) 是一种常用的...
    99+
    2022-11-16
    Python实现单例模式 Python单例模式
  • Vue首屏加载过慢出现白屏的6种优化方案汇总
    目录前言1. 采用懒加载的方式2.webpack开启gzip压缩文件传输模式3.依赖模块采用第三方cdn资源 4.禁止生成map文件5.去掉代码中的console和debu...
    99+
    2023-02-08
    vue首页加载过慢白屏 vue白屏问题 vue首屏白屏原因
  • JavaScript实现继承的6种常用方式总结
    目录1.原型链继承2.借用构造函数继承3.组合继承(经典继承)4.原型式继承方法一:借用构造函数方法二:Object.create()5.寄生式继承6.寄生组合式继承7.ES6、Cl...
    99+
    2024-04-02
  • js金额千分位的6种实现方法实例
    目录方法一 数组分割法方法二 字符截取法方法三 求模法方法四 正则表达式(先行断言)方法五 通过Intl.NumberFormat方法六 number.toLocaleString方...
    99+
    2024-04-02
  • 简单总结单例模式的4种写法
    目录一、单例模式二、写法三、饿汉式四、懒汉式五、内部类六、枚举七、结论一、单例模式 属于创建者模式的一种, 单例模式的目的是使该类只有一个实例,同一个类的不同对象有不同的hashCo...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作