Próbálkozások barátságosabb öröklődési modell emulálására
A JavaScript öröklődési modellje eléggé eltér más klasszikus programozási nyelvekétől (az öröklődési modell a legtöbb hasonlóságot a Self programozási nyelvvel mutatja).
Sok függvénykönyvtár született JavaScriptben, melyek a már meglévő JavaScript osztályok kiterjesztésével más öröklődési modellt tesznek lehetővé. Minden esetben az elsődleges cél megkönnyíteni a fejlesztést, hogy a programozóknak kevesebbet kelljen gépelniük.
A következő két példakód ugyanazt a feladatot oldja meg két népszerű JavaScript függvénykönyvtár segítségével. Látni fogjuk, mennyire eltér a két megoldás egymástól.
Dojo Toolkit
dojo.declare("ClassA", null, {
property1: "public property of ClassA",
statics: {instanceCounter: 0},
initializer: function() {
this.statics.instanceCounter++;
alert("Constructor in ClassA\n Instance:" + this.statics.instanceCounter);
},
method1: function() {
alert("inside 'method1' \n this.property1 = "+ this.property1);
}
});
ClassA.prototype.IdentifyMyself = function(){
return "I am ClassA";
}
dojo.declare("ClassB", ClassA, {
propertyB1 : "public property of ClassB",
getStaticProperty : function(){
alert("this.statics.instanceCounter="+ this.statics.instanceCounter);
}
});
ClassB.prototype.IdentifyMyself = function(){
return "I am ClassB and my parent is: \n\n" + this.inherited('IdentifyMyself', arguments);
};
Base
var ClassA = Base.extend({
constructor: function(){
ClassA.prototype.instanceCounter++;
alert("Constructor in ClassA\n Instance:"+ ClassA.prototype.instanceCounter);
},
property1 : "public property of ClassA",
method1: function() {
alert("inside 'method1' \n this.property1 = "+ this.property1);
}
});
ClassA.prototype.instanceCounter = 0;
ClassA.prototype.IdentifyMyself = function(){
return "I am ClassA";
};
var ClassB = ClassA.extend({
propertyB1 : "public property of ClassB",
constructor: function(){
//this.base(); // képesek vagyunk meghívni a szülő konstruktorát is
},
getStaticProperty : function(){
alert("ClassA.prototype.instanceCounter="+ ClassA.prototype.instanceCounter);
}
});
ClassB.prototype.IdentifyMyself = function(){
return "I am ClassB and my parent is:\n"+ ClassA.prototype.IdentifyMyself(arguments);
};
Mindkét példára jellemző, hogy új osztály létrehozása már nem a jól ismerős függvény konstruktorral történik, helyette a függvénykönyvtár egy metódusán keresztül történik. Erre azért van szükség, mert az újonnan létrejövő osztályt ki kell egészíteni egy sor más tulajdonsággal, hogy az támogasson új funkciókat (például extend metódust az utóbbi példában). Fontos megemlíteni, hogy a kényelemnek ára van. Mivel a függvénykönyvtárak újabb absztrakciót képviselnek és ráadásul szintén JavaScript nyelven íródtak, a teljesítménycsökkenés jelentős.
Az előző példák számunkra egy eddig ismeretlen szintaxist használtak. Az objektum literált a következő fejezet mutatja be.
A témához kapcsolódó példakódok megtalálhatók a peldakodok/orokites/alternativak/ könyvtárban.