设计模式(2)[JS版]---JavaScript如何实现单例模式?

举报
AlbertYang 发表于 2021/02/03 01:09:38 2021/02/03
【摘要】 目录 1 什么是单例模式? 2 单例模式的作用和注意事项 3 代码实现 4 案例应用 4.1 使用单例模式管理命名空间  4.2 使用单例模式为不同命名空间的button按钮添加click事件,并且使他们之间能够互相通信 1 什么是单例模式? 单例就是保证一个类只有一个实例,实现的方法一般是先判断实例存在与否,如果 ...

目录

1 什么是单例模式?

2 单例模式的作用和注意事项

3 代码实现

4 案例应用

4.1 使用单例模式管理命名空间

 4.2 使用单例模式为不同命名空间的button按钮添加click事件,并且使他们之间能够互相通信


1 什么是单例模式?

单例就是保证一个类只有一个实例,实现的方法一般是先判断实例存在与否,如果

存在直接返回,如果不存在就创建了再返回,这就确保了一个类只有一个实例对象。

在JavaScript里,单例作为一个命名空间提供者,从全局命名空间里提供一个唯一

的访问点来访问该对象。

2 单例模式的作用和注意事项

 作用:

1 模块间通信。

2 系统中某个类的对象只能存在一个。

3 保护自己的属性和方法。

注意事项:

1 注意this的使用。

2 闭包容易造成内存泄露,不需要的赶快干掉。

3 注意new的成本。(继承)

3 代码实现

JavaScript实现单例的方式很多种,只要符合定义即可。


  
  1. /*
  2. *1 创建两个独立的对象,xiaoLiu和xiaoWang
  3. *2 让xiaoLiu和xiaoWang通过电话进行通信
  4. *3 让xiaoLiu发起通话;判断xiaoWang有没有电话,如果没有先创建电话
  5. *4 两个单例之间进行通信
  6. */
  7. var xiaoWang = (function(argument) {
  8. var xiaoWangPhone = function(message) {
  9. this.lingsheng = message;
  10. }
  11. var phone;
  12. var info = {
  13. sendMessge: function(message) {
  14. if (!phone) {
  15. phone = new xiaoWangPhone(message);
  16. }
  17. return phone;
  18. }
  19. }
  20. return info;
  21. })();
  22. var xiaoLiu = {
  23. callXiaoWang: function(message) {
  24. var _xw = xiaoWang.sendMessge(message);
  25. alert(_xw.lingsheng);
  26. _xw = null; //等待垃圾回收
  27. }
  28. }
  29. xiaoLiu.callXiaoWang("请求通话");

4 案例应用

4.1 使用单例模式管理命名空间


  
  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="utf-8">
  5. <title></title>
  6. </head>
  7. <body>
  8. </body>
  9. <script>
  10. function Namespace(name){     
  11.     return window[name] || (window[name] = {});     
  12. }
  13.  
  14. (function(){
  15.            
  16.     var myNamespace1 = Namespace("myNamespace1");
  17.      
  18.     myNamespace1.method = function(){
  19.         console.log("XXXX");
  20.     };
  21.  
  22. }())
  23.  
  24. myNamespace1.method();
  25. </script>
  26. </html>

 4.2 使用单例模式为不同命名空间的button按钮添加click事件,并且使他们之间能够互相通信


  
  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="utf-8">
  5. <title>单例应用</title>
  6. <style>
  7. * {
  8. margin: 0;
  9. padding: 0;
  10. }
  11. button {
  12. padding: 10px;
  13. }
  14. </style>
  15. </head>
  16. <body>
  17. <button id="btna">按钮a</button>
  18. <button id="btnb">按钮b</button>
  19. </body>
  20. <script>
  21. //为不同命名空间的button按钮添加click事件,并且使他们之间能够互相通信
  22. var topHtml = {
  23. a: 4,
  24. init: function() {
  25. this.render();
  26. this.bind();
  27. },
  28. render: function() {
  29. var me = this;
  30. me.btna = document.getElementById("btna");
  31. },
  32. bind: function() {
  33. var me = this;
  34. me.btna.onclick = function() {
  35. //业务逻辑取出去
  36. me.test();
  37. }
  38. },
  39. test: function() {
  40. console.log(this.a);
  41. this.a = 5;
  42. console.log(this.a);
  43. }
  44. }
  45. var bottomHtml = {
  46. a: 1,
  47. b: 4,
  48. init: function() {
  49. this.render();
  50. this.bind();
  51. },
  52. render: function() {
  53. var me = this;
  54. me.btnb = document.getElementById("btnb");
  55. },
  56. bind: function() {
  57. var me = this;
  58. me.btnb.onclick = function() {
  59. //业务逻辑取出去
  60. me.test()
  61. }
  62. },
  63. test: function() {
  64. console.log(this.a);
  65. this.a = 3;
  66. console.log(this.a);
  67. console.log(this.b);
  68. this.b = 6;
  69. console.log(this.b);
  70. console.log(topHtml.a);
  71. topHtml.a = 15;
  72. console.log(topHtml.a);
  73. }
  74. }
  75. topHtml.init();
  76. bottomHtml.init();
  77. </script>
  78. </html>

 

文章来源: albertyang.blog.csdn.net,作者:Albert Yang,版权归原作者所有,如需转载,请联系作者。

原文链接:albertyang.blog.csdn.net/article/details/107451561

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。