• js设计模式-单例模式


     

    JavaScript中的单例模式是最常用的、最基本的设计模式,它提供了一种命名空间,减少全局变量泛滥的代码管理机制;

    1、最常见的单例模式:

     

    [javascript] view plain copy
     
    1. //一般用function定义的类,我才会采用首字母大写的方法来约定这个变量为类  
    2. //而对于这种伪类,我通常习惯于使用驼峰式命名法  
    3. var singleton = {  
    4.       attr1: '',  
    5.       attr2: '',  
    6.       method1: function() {},  
    7.      method2:  function() {}  
    8. };  



     

    这是JavaScript开发中最常用的代码组织方式,这种方式在JavaScript执行的时候,就已经创建了实例对象。这样创建的实例对象,所有的属性、方法都是公开的,有一定的风险;一般使用这样的单例模式,我们可以采用下划线_来命名私有变量,来约定为私有变量。但是很不靠谱!

    2、闭包方法的单例模式:

     

    [javascript] view plain copy
     
    1. var singleton = (function() {  
    2.       var _a, _b;    //私有变量  
    3.    
    4.      var that = {}; //new某个类  
    5.    
    6.      //公开接口  
    7.      that.getA = function() {  
    8.           return _a;  
    9.     };  
    10.     that.setA = function(a) {  
    11.          _a = a;  
    12.     };  
    13.    
    14.     that.getB = function() {  
    15.          return _b;  
    16.     };  
    17.     that.setB = function(b) {  
    18.          _b = b;  
    19.    
    20.     };  
    21.    
    22.     return that;   //返回单例  
    23. })();  



     

     

    以上这种方法,实现了单例的私有变量对用户透明,用户所能知道的只有公开的接口,不能随意改变私有变量,但是这种方法还是在执行脚步的时候就产生了一个单例,用户有可能根本就不使用这段代码,这样就会造成内存浪费,更好的做法是将类的实例化推迟到需要的时候再实例化;

    3、lazy方式的单例模式:

     

    [javascript] view plain copy
     
    1. var singleton = (function() {  
    2.       var _a, _b; //私有变量      
    3.       var Class = function() {  
    4.            //code  
    5.       };  
    6.      var that = {};  
    7.     //公开接口  
    8.      that.getA = function() {  
    9.          return _a;  
    10.     };  
    11.     that.setA = function(a) {  
    12.         _a = a;  
    13.     };  
    14.     that.getB = function() {  
    15.         return _b;  
    16.     };  
    17.     that.setB = function(b) {  
    18.        _b = b;  
    19.     };   
    20.     var _instance = null;  
    21.     var getInstance = function() {  
    22.           if(!_instance) {  
    23.                  _instance = new Class();  
    24.            }     
    25.            return _instance;  
    26.     };  
    27.      Class.prototype = that;  
    28.     return {  
    29.           getInstance: getInstance  
    30.    };  
    31. })();  



     

     

    那么这种方法就可以在确实需要这段代码的时候,才实例化,实现懒惰性的单例模式!

  • 相关阅读:
    python网页内容提取神器lxml
    tf–idf算法解释及其python代码
    刷搜索刷下拉框原理
    python爬取全站壁纸代码
    刷百度相关搜索发包参数详解
    Python3 if 变量variable SQL where 语句拼接
    python抓取网站提示错误ssl.SSLCertVerificationError处理
    Windows中的txt文件到Mac打开是乱码 解决办法
    python移动目录下所有子目录文件到新的总目录
    Spring Boot
  • 原文地址:https://www.cnblogs.com/wujindong/p/5261560.html
Copyright © 2020-2023  润新知