构造函数及es6类写单例模式

这篇具有很好参考价值的文章主要介绍了构造函数及es6类写单例模式。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

        前言,什么叫做单例模式?简单点说,单例模式就是只能创建一个由构造函数及类的实体,多次调用得到的都是第一次new出来的对象。用处有,例如在需要全局管理的资源、频繁访问的配置信息、日志记录器、 数据库连接池 等情况下都可以使用单例模式来优化资源的使用和提高系统的性能。

一、传统的构造函数写单例模式

        1、思路

                要获取想只能获取一次实体对象,我们需要在new 构造函数的时候跳出本次new的过程,要跳出此次的new过程,我们需要一个函数变量去缓存上一次new的实体对象,用于判断构造函数已经new过。

        2、普通的new构造函数

// 生命instance变量缓存已new过的实体
let instance = null;
const createSingleton = function (name) {
    // 如果已经new过的跳出并返回缓存的实体,始终保持一个实体
    if (instance) return instance;
    this.name = name;
    instance = this; // 第一次new把实体返回
    return instance;
}
createInstance.prototype.getname = function () {
   console.log(this.name)
};
const a = new createSingleton ('aaa');
const b = new createSingleton ('bbb');
a.getname(); // aaa
b.getname(); // aaa

       生命一个instance变量用于保存第一次new出来的实体对象,在构造函数原型上写一个getname的方法获取name的值。构造函数里判断构造函数是否已经实例化过,然后跳出并返回第一次的实体对象。这种写法有种缺陷,那就是会多出一个外部变量,可能会污染到全局的某个变量的,所以我使用闭包去解决这种问题。

3、结合闭包new构造函数

// IIFE执行函数返回匿名函数当作构造函数,并利用闭包缓存实例化对象
const createInstance = (
    function () {
        let  instance =  null;
        return function (name) {
            // 非第一次实例化跳出并返回第一次实体化对象
            if (instance) return instance;
            this.name = name;
            instance = this;
            return instance;
        }
    }
)();

        我们使用IIFE执行匿名函数,匿名函数里声明一个instance变量去缓存第一次实例化的对象,最后返回一个匿名函数当作构造函数。构造函数里利用instance去判断跳出此次实体化过程,在这个匿名函数里我们使用了闭包,所以我们在多次对这个构造函数实体化时,这个变量始终是第一次缓存下来的那个对象。

二、es6类写单例模式

        1、思路

              es6的类构造函数在类里面的constructor里,是个比较类似java类的一个类,所以我们可以在类里面写一个static的方法来获取这个类的实体(static是静态成员变量,可以让类不需要实例化就可以通过类去调用这个方法),并且做一些相应的判断去判断是否跳出并返回第一次的实体。

        2、实现

class Singleton {
    constructor(name) {
     this.name = name;
     this.instance = null;
    }
    // 构造一个广为人知的接口,供用户对该类进行实例化
    static getInstance(name) {
     if(!this.instance) {
      this.instance = new Singleton(name);
     }
     return this.instance;
    }
    getName () {
        console.log(this.name);
    }
}
Singleton.getInstance('aaaa').getName()
Singleton.getInstance('bbbb').getName()

        在Singletom类的构造函数里同样写一个instance缓存第一次实体化类的对象,同时还有static方法getInstance获取实体化类的对象。getInstance方法用到this.instance去判断是否已经实体化过该类跳出返回实体类,否则实体化这个类。文章来源地址https://www.toymoban.com/news/detail-856245.html

到了这里,关于构造函数及es6类写单例模式的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【JS 构造|原型|原型链|继承(圣杯模式)|ES6类语法】上篇

    ⌚️⌚️⌚️个人格言:时间是亳不留情的,它真使人在自己制造的镜子里照见自己的真相! 📖Git专栏:📑Git篇🔥🔥🔥 📖JavaScript专栏:📑js实用技巧篇,该专栏持续更新中🔥🔥🔥,目的是给大家分享一些常用实用技巧,同时巩固自己的基础,共同进步,欢迎前来交流👀

    2023年04月16日
    浏览(28)
  • JavaScript Es6_2笔记 (深入对象 + 内置构造函数 + 包装类型)+包含实例方法

    了解面向对象编程的基础概念及构造函数的作用,体会 JavaScript 一切皆对象的语言特征,掌握常见的对象属性和方法的使用。 了解面向对象编程中的一般概念 能够基于构造函数创建对象 理解 JavaScript 中一切皆对象的语言特征 理解引用对象类型值存储的的

    2024年02月12日
    浏览(38)
  • js继承的几种方式(原型链继承、构造函数继承、组合式继承、寄生组合式继承、ES6的Class类继承)

    实现原理: 子类的原型指向父类实例 。子类在自身实例上找不到属性和方法时去它父类实例(父类实例和实例的原型对象)上查找,从而实现对父类属性和方法的继承 缺点: 子类创建时不能传参(即没有实现super()的功能); 父类实例的修改会影响子类所有实例 实现原理:

    2024年02月07日
    浏览(33)
  • 单例模式与构造器模式

    单例模式(Singleton Pattern):创建型模式,提供了一种创建对象的最佳方式,这种模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建 在应用程序运行期间,单例模式只会在全局作用域下创建一次实例对象,让所有需要调用的地方都共享这一单

    2024年02月15日
    浏览(29)
  • 【ES6】Generator 函数

    Generator 函数是 ES6 引入的一种新的函数类型,它既可以生成一个序列,又可以在某个条件下停止执行,并在需要时恢复执行。Generator 函数非常适合处理那些需要按需计算的场景,例如处理大数据、生成随机数等。 Generator 函数的基本语法 Generator 函数的语法如下: 其中,* 是

    2024年02月10日
    浏览(26)
  • 【ES6】箭头函数和普通函数的区别

    它们之间的区别: (1)箭头函数没有自己的this。 (2)不可以当作构造函数,不可以对箭头函数使用new命令,否则抛出错误。 (3)不可以使用arguments对象,该对象在函数体内不存在。如果要用,可以用 rest 参数代替。 (4)不可以使用yield命令,箭头函数不能用作 Generator

    2024年02月12日
    浏览(24)
  • 【ES】笔记-ES6的函数rest参数用法

    es6中引入了rest参数,样式形如…xxx,用于获取函数的多余参数,这样就不需要使用arguments对象了。rest参数搭配的一个变量是一个数组,该变量将多余的参数放入数组中。例如: 上面代码的add函数是一个求和函数,利用rest参数,可以向该函数传入任意数目的参数。 下面是一

    2024年02月13日
    浏览(30)
  • 【es6】函数柯里化(Currying)

    柯里化(Currying):把接受多个参数的函数变换成接受一个单一参数(最初函数的第一个参数)的函数,并且返回接受余下的参数且返回结果的新函数。 柯里化由 Christopher Strachey 以逻辑学家 Haskell Curry 命名的,它是 Moses Schnfinkel 和 Gottlob Frege 发明的。 柯里化的应用最为切底是纯

    2024年02月12日
    浏览(19)
  • ES6函数新增了哪些扩展?

    ES6允许为函数的参数设置默认值 函数的形参是默认声明的,不能使用let或const再次声明 参数默认值可以与解构赋值的默认值结合起来使用 上面的foo函数,当参数为对象的时候才能进行解构,如果没有提供参数的时候,变量x和y就不会生成,从而报错,这里设置默认值避免 参

    2024年02月06日
    浏览(33)
  • ES6知识点汇总(4)--函数

    1、参数 ES6允许为函数的参数设置默认值 函数的形参是默认声明的,不能使用let或const再次声明 参数默认值可以与解构赋值的默认值结合起来使用 上面的foo函数,当参数为对象的时候才能进行解构,如果没有提供参数的时候,变量x和y就不会生成,从而报错,这里设置默认值

    2024年02月13日
    浏览(30)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包