基于JavaScript实现单例模式


Posted in Javascript onOctober 30, 2019

首先,了解一下什么是单例模式,这里我直接把菜鸟教程中的定义给copy过来:

单例模式(Singleton Pattern)是 Java 中最简单的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。

这种模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建。这个类提供了一种访问其唯一的对象的方式,可以直接访问,不需要实例化该类的对象。

注意:

1、单例类只能有一个实例。

2、单例类必须自己创建自己的唯一实例。

3、单例类必须给所有其他对象提供这一实例。

用一句话来总结就是:在单例模式中,一个类仅有一个实例,并提供一个访问它的全局访问点。这无非是用一个变量来标志当前是否已经为某个类创建过对象,如果是,则在下一次获取该类的实例时,直接返回之前创建的对象,在JavaScript我们很自然而然就会想到用闭包来解决这个问题。

比如说需要生成一个页面登录框,因为有且只可能有一个登录框,那么你就可以用单例的思想去实现他,代码如下:

let createLoginWindow = function(title) {
  this.title= title;
  this.init();
}

createLoginWindow.prototype.init = function() {
  // some code
  
}
let proxySingleton = (function() {
  var instance;
  return function(title) {
    if (!instance) {
      instance = new createLoginWindow(title);
    }
    return instance;
  }
})();
let windowA = new proxySingleton('login1');
let windowB = new proxySingleton('login2');

console.log(windowA === windowB); // true

可以看到,上述代码中createLoginWindow负责构造对象,然后通过代理proxySingleton来判断是构造新的对象还是返回已有对象。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
javaScript parseInt字符转化为数字函数使用小结
Nov 05 Javascript
js+JQuery返回顶部功能如何实现
Dec 03 Javascript
jquery鼠标放上去显示悬浮层即弹出定位的div层
Apr 25 Javascript
谷歌地图打不开的解决办法
Aug 07 Javascript
javascript处理a标签超链接默认事件的方法
Jun 29 Javascript
jQuery动态增减行的实例代码解析(推荐)
Dec 05 Javascript
深入理解Javascript箭头函数中的this
Feb 13 Javascript
JavaScript实现的商品抢购倒计时功能示例
Apr 17 Javascript
温故知新——JavaScript中的字符串连接问题最全总结(推荐)
Aug 21 Javascript
jQuery动态生成的元素绑定事件操作实例分析
May 04 jQuery
vue实现虚拟列表功能的代码
Jul 28 Javascript
jQuery中event.target和this的区别详解
Aug 13 jQuery
vue解决使用$http获取数据时报错的问题
Oct 30 #Javascript
茶余饭后聊聊Vue3.0响应式数据那些事儿
Oct 30 #Javascript
vue请求服务器数据后绑定不上的解决方法
Oct 30 #Javascript
vue中的mescroll搜索运用及各种填坑处理
Oct 30 #Javascript
vue解决花括号数据绑定不成功的问题
Oct 30 #Javascript
vue中使用rem布局代码详解
Oct 30 #Javascript
vue进入页面时不在顶部,检测滚动返回顶部按钮问题及解决方法
Oct 30 #Javascript
You might like
php数组索引的Key加引号和不加引号的区别
2014/08/19 PHP
通过php删除xml文档内容的方法
2015/01/23 PHP
Centos 6.5系统下编译安装PHP 7.0.13的方法
2016/12/19 PHP
PHP实现网页内容html标签补全和过滤的方法小结【2种方法】
2017/04/27 PHP
PHP设计模式之工厂方法设计模式实例分析
2018/04/25 PHP
关于PHP求解三数之和问题详析
2020/11/09 PHP
JavaScript arguments 多参传值函数
2010/10/24 Javascript
js实现的仿新浪微博完美的时间组件升级版
2011/12/20 Javascript
javascript延时加载之defer测试
2012/12/28 Javascript
js用闭包遍历树状数组的方法
2014/03/19 Javascript
javascript中使用正则表达式清理table样式的代码
2020/04/01 Javascript
JavaScript匿名函数之模仿块级作用域
2015/12/12 Javascript
解决js函数闭包内存泄露问题的办法
2016/01/25 Javascript
浅谈JavaScript中数组的增删改查
2016/06/20 Javascript
基于jQuery实现仿微博发布框字数提示
2016/07/27 Javascript
Bootstrap实现带暂停功能的轮播组件(推荐)
2016/11/25 Javascript
canvas实现钟表效果
2017/02/13 Javascript
VUE axios上传图片到七牛的实例代码
2017/07/28 Javascript
微信小程序冒泡事件及其阻止方法实例分析
2018/12/06 Javascript
Node.js 进程平滑离场剖析小结
2019/01/24 Javascript
使用Vue中 v-for循环列表控制按钮隐藏显示功能
2019/04/23 Javascript
koa router 多文件引入的方法示例
2019/05/22 Javascript
JS常见内存泄漏及解决方案解析
2020/05/30 Javascript
用Python制作简单的钢琴程序的教程
2015/04/01 Python
Python 12306抢火车票脚本
2018/02/07 Python
tensorflow 打印内存中的变量方法
2018/07/30 Python
python树莓派红外反射传感器
2019/01/21 Python
在python中利用dict转json按输入顺序输出内容方式
2020/02/27 Python
新手学习Python2和Python3中print不同的用法
2020/06/09 Python
家长对孩子评语
2014/01/30 职场文书
后备干部考察材料
2014/02/12 职场文书
结婚十年感言
2015/07/31 职场文书
《蜜蜂引路》教学反思
2016/02/22 职场文书
Vue中Object.assign清空数据报错的解决方案
2022/03/03 Vue.js
Mysql将字符串按照指定字符分割的正确方法
2022/05/30 MySQL
一篇文章带你掌握SQLite3基本用法
2022/06/14 数据库