Declaring Singleton with public and private members in Javascript
I just had my javascript venture reviewed by my buddy Kenneth Wrang, who I consider a master of Javascript (eventhough he wouldn't admit it). I learned a few valuable things about this language, and how it differ to other languages like C#.
The first one I want to share here is how to declare singleton in Javascript, and how I could create private/public members. They may not be obvious since Javascript doesn't have special keywords for class, public and private modifiers.
var aSingleton = (function() { // NOTE 1: these are the private members // they will not be accessible from outside the scope of this 'function' var privateMember = "test"; var someCollection = []; // NOTE 2: this is a private class within the singleton // var1 and var2 are the dependencies of the class // similar to a constructor in other language like C# function aPrivateClass(var1, var2) { // NOTE 3: state is also a private member var state = "state"; return { // NOTE 4: public member to the private class anInnerFunction: function() { $(document.body).append("<p>" + state + "</p>"); } }; } return { // NOTE 5: these are the public members aPublicFunction: function() { // NOTE 6: private class will be accessible from the public methods // thanks to Closure someCollection.push(aPrivateClass("dependency1", "dependency2")); // NOTE 7: eventhough the private members of the private class cannot // be accessed, the public members of the private class are. someCollection[0].anInnerFunction(); } }; })(); // NOTE 8: from this point on, we have our singleton created // with only the public members exposed. aSingleton.aPublicFunction();
Most of the notes are already done in-line, so hopefully the example will be self explanatory. However I'd like to point out something that may not be obvious:
Private members are all members before the return statement
for e.g
Note 1, Note 2 in the scope of aSingleton, and
Note 3 in the scope of aPrivateClass.
Public members are all the members inside the return statement
for e.g
Note 5 in the scope of aSingleton, and
Note 4 in the scope of aPrivateClass.