zoukankan      html  css  js  c++  java
  • JS的单例模式

    维基百科对单例模式的介绍如下:

    在应用单例模式时,生成单例的类必须保证只有一个实例的存在,很多时候整个系统只需要拥有一个全局对象,才有利于协调系统整体的行为。比如在整个系统的配置文件中,配置数据有一个单例对象进行统一读取和修改,其他对象需要配置数据的时候也统一通过该单例对象来获取配置数据,这样就可以简化复杂环境下的配置管理。

    实现一、最简单的字面量写法

    <script type="text/javascript">
    	var singleton = {
            attr: 1,
            method: function(){ return this.attr;}
        }
    	var t1 = singleton;
    	var t2 = singleton;
    
    	alert(t1 === t2); // true
    </script>
    

    十分简单,并且非常使用,不足之处在于没有什么封装性,所有的属性方法都是暴露的。对于一些需要使用私有变量的情况就显得心有余而力不足了。当然在对于 this 的问题上也是有一定弊端的。

    实现二、构造函数内部判断

    <script type="text/javascript">
    	function Construct(){
    	    // 确保只有单例
    	    if( Construct.unique !== undefined ){
    	        return Construct.unique; 
    	    }
    
    	    // 其他代码
    	    this.name = "NYF";
    	    this.age="24";
    	    Construct.unique = this;
    	}
    	var t1 = new Construct() ;
    	var t2 = new Construct() ;
    </script>
    

    也是非常简单,无非就是提出一个属性来做判断,但是该方式也没有安全性,一旦我在外部修改了Construct的unique属性,那么单例模式也就被破坏了。

    实现三、闭包方式

    对于打着"灵活"牌子的JS来说,任何问题都能找到 n 种答案,只不过让我自己去掂量孰优孰劣而已,下面就简单的举几个使用闭包实现单例模式的方法,无非也就是将创建了的单例缓存而已。

    <script type="text/javascript">
    	var single = (function(){
    		var unique;
    		function Constructor() {
    			this.name = "NYF";
    		    this.age="24";
    		}
    		unique = new Constructor();
    		return unique;
    
    	})();
    	var t1 = single;
    	var t2 = single;
    
    	alert(t1 === t2);
    </script>
    

    只要 每次讲 var t1 = single; var t2 = single;即可。 与对象字面量方式类似。不过相对而言更安全一点,当然也不是绝对安全。

    如果希望会用调用 single() 方式来使用,那么也只需要将内部的 return 改为

    return function(){
        return unique;
    } 
    

    以上方式也可以使用 new 的方式来进行(形式主义的赶脚)。当然这边只是给了闭包的一种例子而已,也可以在 Construct 中判断单例是否存在 等等。 各种方式在各个不同情况做好选着即可。

    参考原文http://my.oschina.net/humaotegong/blog/410666?p=1

  • 相关阅读:
    正向代理/反向代理理解、Nginx概述、安装及配置详解
    项目部署问题:xftp无法连接服务器、Nginx403 Forbidden解决、nginx反向代理解决前端跨域问题
    Vue上传文件:ElementUI中的upload实现
    理解Vue的计算属性
    今天在CSDN看懂这个帖子,也是我的困惑,记录一下(过了三十的码农,你选择的是哪个,说出你的想法)
    WCF IIS上部署服务
    [转]WCF RESTful service and WebGrid in ASP.NET MVC 5
    WCF 与其它技术的比较
    Visual Studio Debug和Release的区别及obj的作用
    C# Json格式字符串
  • 原文地址:https://www.cnblogs.com/zhongshanblog/p/4822492.html
Copyright © 2011-2022 走看看