89 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
			
		
		
	
	
			89 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
| ---
 | |
| title: Creating a Singleton in JavaScript
 | |
| ---
 | |
| 
 | |
| ## Creating a Singleton in JavaScript
 | |
| 
 | |
| A singleton is an object that only allows one instance of itself to be created and allows a global point of access to it. The singleton design pattern can be useful if you have some data that should remain the same throughout your application.
 | |
| 
 | |
| ### Let's Get Started
 | |
| 
 | |
| Let's create an object with an immediately-invoked function expression (or _IIFE_, pronounced "iffy") that will give us the effect of a singleton.
 | |
| 
 | |
| ```
 | |
| var singletonFn = (function(){ // Created IIFE Function
 | |
|   var dataCounter = 0;
 | |
|   return { // Any code inside this return stuff will be accessible directly using objectname.
 | |
|     
 | |
|     getDataCounter: function(){
 | |
|       return dataCounter;
 | |
|     },
 | |
|   
 | |
|     setDataCounter: function(val){
 | |
|       dataCounter = val;
 | |
|     },
 | |
|     
 | |
|     fishNames: ["SimpleFish"] // Can create variables, arrays, etc.
 | |
|   }
 | |
| })();
 | |
| 
 | |
| console.log(singletonFn.getDataCounter()); // 0 by default
 | |
| 
 | |
| singletonFn.setDataCounter(20);
 | |
| 
 | |
| console.log(singletonFn.getDataCounter()); // 20
 | |
| 
 | |
| console.log(singletonFn.fishNames); // ["SimpleFish"]
 | |
| ```
 | |
| 
 | |
| Here's another example of a singleton:
 | |
| 
 | |
| ```
 | |
| var Person;
 | |
| 
 | |
| (function() {
 | |
|   let instance;
 | |
| 
 | |
|   Person = function(fName, lName, job) {
 | |
|     // constructor
 | |
|     this.fName = fName || 'John';
 | |
|     this.lName = lName || 'Doe';
 | |
|     this.job = job || 'Software Engineer';
 | |
|     
 | |
|     if (!instance) {
 | |
|       instance = this;
 | |
|     }
 | |
| 
 | |
|     this.getFullName = function () {
 | |
|       return this.fName + ' ' + this.lName;
 | |
|     }
 | |
|     
 | |
|     this.getJob = function () {
 | |
|       return this.job;
 | |
|     }
 | |
| 
 | |
|     this.print = function () {
 | |
|       console.log(this.getFullName() + ' ' + this.getJob());
 | |
|     }
 | |
| 
 | |
|     return instance;
 | |
|   }
 | |
| })();
 | |
| 
 | |
| //initialize these "guys" but they point to the same object
 | |
| var guy1 = new Person();
 | |
| var guy2 = new Person();
 | |
| 
 | |
| // proof that they're the same instance
 | |
| guy1.print(); // "John Doe Software Engineer"
 | |
| guy2.print(); // "John Doe Software Engineer"
 | |
| console.log(guy1 == guy2); //true
 | |
| 
 | |
| // modify guy2 and see that guy1 has changed as well
 | |
| guy2.fName = 'Jane';
 | |
| guy2.lName = 'Doo';
 | |
| guy2.job = 'Project Manager';
 | |
| guy1.print(); // "Jane Doo Project Manager"
 | |
| guy2.print(); // "Jane Doo Project Manager"
 | |
| ```
 |