Back to Blog

Singleton function in JavaScript

on April 11, 2010

Recently I was discussed with a friend how to create a singleton function in JavaScript. I am putting the same information here in case it might help someone understand JavaScript better.

Creating an Object

Simplest solution is creating an instance of the object.

1var Logger = function (path) {
2  this.path = path;
3};
4
5l1 = new Logger("/home");
6console.log(l1);
7
8l2 = new Logger("/dev");
9console.log(l2);
10
11console.log(l1 === l2);

Above solution works. However l2 is a new instance of Logger .

Singleton solution using a global variable

1window.global_logger = null;
2var Logger = function (path) {
3  if (global_logger) {
4    console.log("global logger already present");
5  } else {
6    this.path = path;
7    window.global_logger = this;
8  }
9  return window.global_logger;
10};
11
12l1 = new Logger("/home");
13console.log(l1);
14
15l2 = new Logger("/dev");
16console.log(l2);
17
18console.log(l1 === l2);

Above solution works. However this solution relies on creating a global variable. To the extent possible it is best to avoid polluting global namespace.

Single solution without polluting global namespace

1var Logger = (function () {
2  var _instance;
3
4  return function (path) {
5    if (_instance) {
6      console.log("an instance is already present");
7    } else {
8      this.path = path;
9      _instance = this;
10    }
11
12    return _instance;
13  };
14})(); //note that it is self invoking function
15
16var l1 = new Logger("/root");
17console.log(l1);
18
19var l2 = new Logger("/dev");
20console.log(l2);
21
22console.log(l1 === l2);

This solution does not pollute global namespace.


You might also like

If you liked this blog post, check out similar ones from BigBinary