基于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 相关文章推荐
编辑浪子版表单验证类
May 12 Javascript
JS查看对象功能代码
Apr 25 Javascript
基于jquery的一个简单的脚本验证插件
Apr 05 Javascript
jquery 学习之一 对象访问
Nov 23 Javascript
JavaScript取得鼠标绝对位置程序代码介绍
Sep 16 Javascript
JS实现定时页面弹出类似QQ新闻的提示框
Nov 07 Javascript
jquery通过a标签删除table中的一行的代码
Dec 02 Javascript
详解Wondows下Node.js使用MongoDB的环境配置
Mar 01 Javascript
深入理解Vue-cli搭建项目后的目录结构探秘
Jul 13 Javascript
vue2.0 兄弟组件(平级)通讯的实现代码
Jan 15 Javascript
通过js实现压缩图片上传功能
Feb 25 Javascript
解决vue中的无限循环问题
Jul 27 Javascript
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
PHP3 safe_mode 失效漏洞
2006/10/09 PHP
不错的一篇面向对象的PHP开发模式(简写版)
2007/03/15 PHP
PHP下打开phpMyAdmin出现403错误的问题解决方法
2013/05/23 PHP
php获取用户浏览器版本的方法
2015/01/03 PHP
ThinkPHP中Common/common.php文件常用函数功能分析
2016/05/20 PHP
使用Entrust扩展包在laravel 中实现RBAC的功能
2020/03/16 PHP
PHP获取php,mysql,apche的版本信息及更多服务器信息
2021/03/09 PHP
070823更新的一个[消息提示框]组件 兼容ie7
2007/08/29 Javascript
javascript数组的扩展实现代码集合
2008/06/01 Javascript
$.each遍历对象、数组的属性值并进行处理
2014/07/18 Javascript
分享一个常用的javascript静态类
2014/12/31 Javascript
jQuery中attr()方法用法实例
2015/01/05 Javascript
jQuery调用Webservice传递json数组的方法
2016/08/06 Javascript
Vuex模块化实现待办事项的状态管理
2017/03/15 Javascript
node.js中使用Export和Import的方法
2017/09/18 Javascript
教你如何编写Vue.js的单元测试的方法
2018/10/17 Javascript
JS二级菜单不同实现方法分析【4种方法】
2018/12/21 Javascript
JS中创建自定义类型的常用模式总结【工厂模式,构造函数模式,原型模式,动态原型模式等】
2019/01/19 Javascript
Python类的专用方法实例分析
2015/01/09 Python
shelve  用来持久化任意的Python对象实例代码
2016/10/12 Python
python3+PyQt5实现使用剪贴板做复制与粘帖示例
2017/01/24 Python
利用PyCharm Profile分析异步爬虫效率详解
2019/05/08 Python
python集合常见运算案例解析
2019/10/17 Python
python基于pygame实现飞机大作战小游戏
2020/11/19 Python
python3爬虫中多线程的优势总结
2020/11/24 Python
用ldap作为django后端用户登录验证的实现
2020/12/07 Python
PyQt实现计数器的方法示例
2021/01/18 Python
将"引用"作为函数返回值类型的格式、好处和需要遵守的规则
2016/02/09 面试题
关于赌博的检讨书
2014/01/24 职场文书
《孔子游春》教学反思
2014/02/25 职场文书
2015年全国爱眼日活动小结
2015/02/27 职场文书
个人工作保证书
2015/02/28 职场文书
《鸟的天堂》教学反思
2016/02/19 职场文书
MySQL中rank() over、dense_rank() over、row_number() over用法介绍
2022/03/23 MySQL
vue3 自定义图片放大器效果的示例代码
2022/07/23 Vue.js
MySQL数据库查询之多表查询总结
2022/08/05 MySQL