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