JavaScript/Notes/Singleton

From Noisebridge
< JavaScript(Difference between revisions)
Jump to: navigation, search
(Factory Method)
(Lazy Initialization)
(15 intermediate revisions by 3 users not shown)
Line 1: Line 1:
 
Singleton with information hiding.
 
Singleton with information hiding.
  
== Factory Method ==
+
== Constructors ==  
 +
Before going over Singleton patterns, lets first take a look at [http://jsbin.com/IBAbIgI/6/edit how constructors work].
 +
 
 +
== Lazy Initialization ==
 +
This example of a Singleton uses my patented "function rewriting" technique, where `getAnObject` is identifier is reassigned to the nested closure.
 
<source lang="javascript">
 
<source lang="javascript">
 
function getAnObject(a) {
 
function getAnObject(a) {
 
   var anObject;
 
   var anObject;
 +
 +
  var b = a + 1;
  
 
   return (getAnObject = function() {
 
   return (getAnObject = function() {
 
     if(! anObject ) {
 
     if(! anObject ) {
       anObject = {name: a};
+
       anObject = {name: b};
 
     }
 
     }
 
     return anObject;
 
     return anObject;
Line 15: Line 21:
 
</source>
 
</source>
  
== Instant Loaded ==  
+
== Eager Initialization ==
 +
 
 +
Not a Singleton, but a constructor.
 +
<source lang="javascript">
 +
// Not a Singleton.
 +
var C = function(a) {
 +
  var b = a + 2;
 +
  this.name = b;
 +
};
 +
 
 +
var o1 = new C(3);
 +
var o2 = new C(4);
 +
var o3 = new C(5);
 +
</source>
 +
 
 +
Example: Constructors and prototype inheritance.
 +
[http://jsbin.com/IBAbIgI/6/edit jsbin]
 +
 
 +
Singleton:
 +
<source lang="javascript">
 
var anObject = new function(a) {
 
var anObject = new function(a) {
   this.name = a;
+
// hidden variables.
 +
  var b = a + 2;
 +
   this.name = b;
 +
}(3);
 +
 
 +
alert(anObject.name);
 +
alert(typeof b); // "undefined"
 +
</source>
 +
 
 +
The function scope allows us to hide variable `b`.
 +
[http://jsbin.com/ErAHEFo/1/edit jsbin]
 +
 
 +
An object literal does not allow information hiding:
 +
<source lang="javascript">
 +
// exposed variables.
 +
var a = 3;
 +
var b = a + 2;
 +
var anObject = {
 +
  name : b;
 
};
 
};
 +
</source>
 +
 +
Example: [http://garretts.github.io/ape-javascript-library/build/anim/Animation.js APE Animation Manager]

Revision as of 19:58, 23 November 2013

Singleton with information hiding.

Constructors

Before going over Singleton patterns, lets first take a look at how constructors work.

Lazy Initialization

This example of a Singleton uses my patented "function rewriting" technique, where `getAnObject` is identifier is reassigned to the nested closure.

function getAnObject(a) {
  var anObject;
 
  var b = a + 1;
 
  return (getAnObject = function() {
    if(! anObject ) {
      anObject = {name: b};
    }
    return anObject;
  })();
}

Eager Initialization

Not a Singleton, but a constructor.

// Not a Singleton.
var C = function(a) {
  var b = a + 2;
  this.name = b;
};
 
var o1 = new C(3);
var o2 = new C(4);
var o3 = new C(5);

Example: Constructors and prototype inheritance. jsbin

Singleton:

var anObject = new function(a) {
// hidden variables.
  var b = a + 2;
  this.name = b;
}(3);
 
alert(anObject.name); 
alert(typeof b); // "undefined"

The function scope allows us to hide variable `b`. jsbin

An object literal does not allow information hiding:

// exposed variables.
var a = 3;
var b = a + 2;
var anObject = {
  name : b;
};

Example: APE Animation Manager

Personal tools