Hoe werkt JavaScript OO

Object georiënteerd programmeren in JavaScript is synthetisch. Het is mogelijk maar ziet er vreemd uit als je het terug leest.
Er zijn verschillende JavaScript bibliotheken die OO programmeren in JavaScript vereenvoudigen maar het blijft niet hetzelfde als bijvoorbeeld Java of C#.
Na een hoop programmeren in JavaScript met Ext wilde ik kijken of ik het zelf kon zonder de toeters en bellen. En beter begrijpen hoe het OO programmeren in JavaScript werkt.

Ik ben wat gaan stoeien met ‘pure’ JavaScript om tot dit voorbeeld te komen. Dit is een zeer dom voorbeeld maar demonstreert (in mijn ogen) hoe het principe werkt:

if (!window.Sogyo) {
    Sogyo = {};
}

if (!Sogyo.Vehicle) {
   Sogyo.Vehicle = {};
}

Sogyo.Vehicle = function () {
}

Sogyo.Vehicle.prototype.move = function () {
   document.write("[Vehicle]");
}

if (!Sogyo.Bike) {
    Sogyo.Bike = {};
}

Sogyo.Bike = function () {
}

Sogyo.Bike.prototype.move = function () {
   Sogyo.Vehicle.prototype.move();	
   return "Ik ben een motor";
}

if (!Sogyo.Car) {
   Sogyo.Car = {};
}

Sogyo.Car = function () {
}

Sogyo.Car.prototype.move = function () {
   Sogyo.Vehicle.prototype.move();	
   return "Ik ben een auto";
}

var bike = new Sogyo.Bike();
document.write(bike.move());

var car = new Sogyo.Car();
document.write(car.move());

Bij het uitvoeren van deze code komt het volgende in beeld (in de browser):

[Vehicle]Ik ben een motor[Vehicle]Ik ben een auto 

De move methode bij de Car en Bike ‘class’ roepen hard de parent move methode aan op Vehicle. Dit is nu een niet al te intelligente methode die iets neerzet op het HTML document.

Het demonstreert wel hoe frameworks als Prototype dit doen.
Bij prototype is er een reeds geinstantieerde functie genaamd Class. Bij het aanroepen van deze functie worden eigenschappen en methoden gekopieerd om het gedrag mee te nemen naar het afgeleid object. De aanroep naar de parent classe die ik in mijn voorbeeld zelf doe wordt automatisch, via event rewiring, gedaan in the Class functie.

Om een class aan te maken in Prototype ziet er als volgt uit:

MyClass = Class.create({
   initialize: function() {
      alert("Hoi");
   }
});

var test = new MyClass();

Dit voorbeeld geeft als resultaat de alert met de tekst ‘Hoi’.

Ik de laatste tijd mogen ontdekken dat JavaScript is een zeer krachtige taal is. Het enige wat ik jammer vind is dat object georiënteerd programmeren in JavaScript synthetisch is en dat vereist (zo goed als) om gebruik te maken van bestaande JavaScript frameworks.
Want ik denk dat meerdere mensen het met mij eens zijn als ik zeg dat het tweede voorbeeld een stuk duidelijk is dan het eerste…