Javascript单例模式有何用?实现方法是什么?
Admin 2021-10-21 群英技术资讯 558 次浏览
单例模式也称为单体模式,规定一个类只有一个实例,并且提供可全局访问点;
在读这篇文章之前,也许你对单例模式的概念感到模糊或者不清楚,但是其实在日常的开发中你肯定用到过单例模式;
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"); //winner console.log(winner.getName()); let sunner = Singleton.getInstance("sunner"); //winner console.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"); //winner console.log(winner.getName()); let sunner = new CreateSingleton("sunner"); //winner console.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单例模式的内容就介绍到这,上述实例具有一定的借鉴价值,感兴趣的朋友可以参考,最后,想要了解更多JavaScript设计模式的实现,大家可以关注其它的相关文章。
文本转载自脚本之家
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:mmqy2019@163.com进行举报,并提供相关证据,查实之后,将立刻删除涉嫌侵权内容。
猜你喜欢
async函数的返回值为 promise 对象,promise对象的结果由async函数执行的返回值决定。async函数能使得异步操作变得更加方便,简而言之就是 Generator 的语法糖。
本文主要介绍了Vue实现Echarts图表宽高自适应的实践,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
Cocos Creator 允许你将代码拆分成多个脚本文件,并且让它们相互调用。这个步骤简称为 模块化。
这篇文章主要介绍了vue-quill-editor插入图片路径太长问题解决方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
倒计时提示框在网页设计中是比较常见的,可应用作自动弹窗,自动关闭,那么究竟要如何实现倒计时提示框呢?下面是基于javascript实现倒计时提示框的介绍,实现效果如下:
成为群英会员,开启智能安全云计算之旅
立即注册Copyright © QY Network Company Ltd. All Rights Reserved. 2003-2020 群英 版权所有
增值电信经营许可证 : B1.B2-20140078 粤ICP备09006778号 域名注册商资质 粤 D3.1-20240008