I’ve always found JavaScript’s approach(es) to OOP a little cumbersome. I’m not talking here about prototypal vs. class-based OOP. Rather, I’m talking about the readability, etc. of the actual code you have to write to build objects. I want to take a few blog entries to try to put the maze into some kind of cohesive perspective.
I like to use a tally clicker to explore objects in languages I am learning. A tally clicker is a real-world object with a minimal set of features that are easy to implement and that map to basic but salient OOP concepts.
Object literals
I’m going to start this exploration with plain-Jane object literals. This is one of the canonical ways and often the first way shown to implement objects in JavaScript. Here’s how I might implement a tally clicker with a JavaScript literal:
// == Create a tally clicker ========
var myClicker = {
// pseudo-private property
_numClicks: 0,
// pseudo-private method
_update: function() {
console.log("myClicker1: " + this._numClicks);
},
// public methods
click: function() {
this._numClicks++;
this._update();
},
reset: function() {
this._numClicks = 0;
this._update();
},
showInfo: function() {
alert('I am "myClicker" and am at ' +
this._numClicks + ' clicks.');
}
}; // == End tally clicker ========
I might then stick something like this into the HTML:
<button onclick="myClicker.click();">Click</button>
<button onclick="myClicker.reset();">Reset</button>
<button onclick="myClicker.showInfo();">Info</button>
The object literal approach is a seductively easy and pretty readable way to build an object—but it’s got issues. Namely:
- There’s no automatic initialization apart from property values.
- It violates encapsulation because everything is public.*
- It pollutes the global namespace (sort of). As is, the name of the object is in the global namespace.
- The object abstraction doesn’t scream, “Reuse me!” (This may be a cognitive style issue more than anything else.)
In the next couple installments, I’ll consider some alternative implementations specifically with regard to the above criteria. For the moment, I will not deal with:
- Inheritance-like stuff
- “Class” (i.e., static) members*
- Polymorphism
*An issue of religious importance.