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"
 | 
						|
```
 |