关闭

JavaScript中的单例模式

标签: javascriptfunctionvariablesmethodsobjectaccess
209人阅读 评论(0) 收藏 举报
分类:
        单例模式在软件工程中的应用比较广泛,一般的做法是第一次创建对象,再次访问的时候都是返回这个对象的引用。在传统面向对象语言里,单例一般都是通过静态变量的方式存储。在JavaScript中通过一个全局的命名空间提供单一的一个函数入口。

        单例模式在JavaScript中有很多种表现方式,最简单的一种就是讲一些属性,方法组合到一个对象中,如下所示。  

var mySingleton = {
	  property1: "something",
	 
	  property2: "something else",
	 
	  method1:function(){
	    console.log('hello world');
	  }
	 
	};
        第一种方式其实只是简单定义了一个全局变量,如果你想扩展这个方式,你可以封装变量和方法来添加自己的私有方法和私有成员,只提供通用的接口。

var mySingleton = function(){
	  
	  // here are our private methods and variables
	  var privateVariable = 'something private';
	  function showPrivate(){
	    console.log( privateVariable );
	  }
	  
	  // public variables and methods (which can access
	  // private variables and methods )
	  return {
	 
	    publicMethod:function(){
	      showPrivate();
	    },
	 
	    publicVar:'the public can see this!'
	 
	  };
	};
	  
	var single = mySingleton();
	single.publicMethod();  // logs 'something private'
	console.log( single.publicVar ); // logs 'the public can see this!'

上面的例子已经很完整了,但是如果考虑到只想在需要他的时候才实例化对象的这种情况。就要通过保存一个变量资源,你可以通过其他的构造函数去实例化,代码如下:

var Singleton = (function(){
	  var instantiated;
	 
	  function init (){
	    // singleton here
	    return {
	      publicMethod: function(){
	        console.log( 'hello world' );
	      },
	      publicProperty: 'test'
	    };
	  }
	  
	  return {
	    getInstance: function(){
	      if ( !instantiated ){
	        instantiated = init();
	      }
	      return instantiated;
	    }
	  };
	})();
	  
	// calling public methods is then as ea
	Singleton.getInstance().publicMethod();
讲了这么多,单例模式真的再JS中有用吗?下面通过一个经纬度系统的实现方式来简单展示下他的用途。


var SingletonTester = (function(){
	 
	  // args: an object containing arguments for the singleton
	  function Singleton( args ) {
	 
	   // set args variable to args passed or empty object if none provided.
	    var args = args || {};
	    //set the name parameter
	    this.name = 'SingletonTester';                                    
	    //set the value of pointX
	    this.pointX = args.pointX || 6; //get parameter from arguments or set default
	    //set the value of pointY
	    this.pointY = args.pointY || 10;  
	 
	  }
	   
	 // this is our instance holder
	  var instance;
	 
	 // this is an emulation of static variables and methods
	  var _static = {
	    name: 'SingletonTester',
	   // This is a method for getting an instance
	 
	   // It returns a singleton instance of a singleton object
	    getInstance: function ( args ){
	      if (instance === undefined) {
	        instance = new Singleton( args );
	      }
	      return instance;
	    }
	  };
	  return _static;
	})();
	 
	var singletonTest = SingletonTester.getInstance({pointX: 5});



0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:2571次
    • 积分:81
    • 等级:
    • 排名:千里之外
    • 原创:2篇
    • 转载:1篇
    • 译文:3篇
    • 评论:0条
    文章存档