zoukankan      html  css  js  c++  java
  • javascript -- 单例模式

     1 //单例模式(单例模式的核心是确保只有一个实例,并提供全局访问。)
     2 var Create = (function(){
     3     var instance;
     4     var Create = function(name){
     5         if(instance){
     6             return instance;
     7         }
     8         this.name = name;
     9         return instance = this;
    10     }
    11     return Create;
    12 })();
    13 
    14 var create1 = new Create("lu");
    15 var create2 = new Create("guiqing");
    16 console.log(create2.name);//lu
    17 console.log(create1.name);//lu
    18 //这里,我们使用了自执行的匿名函数和闭包,用于封装instance变量,但当我们想得到普通的构造函数,这要修改我们的构造函数,会很麻烦,所以下面用代理的单例模式
    19 
    20 
    21 var Create = function(name){
    22     this.name = name;
    23 }
    24 
    25 var ProxyCreate = (function(){
    26     var instance;
    27     return function(name){
    28         if(instance){
    29             return instance;
    30         }
    31         instance = new Create(name);
    32         return instance;
    33     }
    34 })();
    35 
    36 var create1 = new Create("normal");
    37 var create2 = new ProxyCreate("gui");
    38 var create3 = new ProxyCreate("qing");
    39 
    40 console.log(create1);//normal
    41 console.log(create2);//gui
    42 console.log(create3);//gui
    43 
    44 //我们通过把构造函数给提取出来,用代理的方式实现单例

    JavaScript 中的单例模式传统的单例模式实现在JavaScript 中并不适用

    var a = {};
    当用这种方式创建对象a 时,对象a 确实是独一无二的。如果a 变量被声明在全局作用域下,
    则我们可以在代码中的任何位置使用这个变量,全局变量提供给全局访问是理所当然的。这样就
    满足了单例模式的两个条件。

    但是这种容易造成全局污染

    ①  通过定义对象字面量来减少全局变量的冲突

    ②  使用闭包封装私有变量

     

    单例的用处

    单例模式是一种简单但非常实用的模式,特别是惰性单例技术,在合适的时候才创建对象,并且只创建唯一的一个。

    var createLoginLayer = function(){
    	console.log("in")
    	console.log(this)
    	var div = document.createElement( 'div' );
    	div.innerHTML = '我是登录浮窗';
    	div.style.display = 'none';
    	document.body.appendChild( div );
    	return div;
    };
    var getSingle = function( fn ){
    	var result;
    	  return function(){
    	  return result || ( result = fn .apply(this, arguments ) );
    	}
    };
    var createSingleLoginLayer = getSingle( createLoginLayer );
    document.getElementById( 'loginBtn' ).onclick = function(){
    	var loginLayer = createSingleLoginLayer();
    	loginLayer.style.display = 'block';
    };
    

      

  • 相关阅读:
    ExtJs学习笔记之ComboBox组件
    ExtJs学习笔记之学习小结LoginDemo
    ExtJs学习笔记之Button组件
    ExtJs学习笔记之TextField
    WAF指纹识别和XSS过滤器绕过技巧
    python中的迭代与递归
    使用Python对文档单词进行计数
    Python正则表达式使用实例
    Python十六进制与字符串的转换
    数组名a,数组名取地址&a,数组首地址&a[0],数组指针*p
  • 原文地址:https://www.cnblogs.com/luguiqing/p/7718033.html
Copyright © 2011-2022 走看看