Prototípus alapú öröklődés
Az öröklődést más nyelvek általában a következő szintaxissal támogatják.
class Parent{
}
class Child extends Parent{
}
JavaScriptben nincsen operátor az öröklődésre, ennek ellenére JavaScriptben lehetséges az öröklődés (JavaScriptben nem örökíthetünk beépített objektumból. Lásd orokites/3.html. A prototípus alapú öröklődés lényege, hogy a konstruktor függvény prototípusának egy teljes objektumot adunk értékül, így annak összes tulajdonsága meg fog jelenni a gyerek objektumban.
subClass.prototype = new superClass;
Íme egy egyszerű példa:
function ClassA(){
this.x = 0;
alert('Constructor A');
this.Bemutatkozas = function(){
alert("En ClassA példány vagyok");
};
}
function ClassB(){
this.getX = function (){
return this.x;
};
this.setX = function (newValue){
this.x = newValue;
};
this.Bemutatkozas = function(){
alert("En ClassB példány vagyok");
};
}
ClassB.prototype = new ClassA();
Privát láthatóságú tagváltozókra ügyelni kell prototípus alapú öröklődési modell használatakor, mivel meglepetéseket okozhat.
function ClassA(){
var _private = 0;
this.getPrivate = function(){
return _private;
};
this.setPrivate = function(_value){
_private = _value;
};
}
function ClassB(){};
ClassB.prototype = new ClassA;
var oB = new ClassB();
var oB2= new ClassB();
oB2.setPrivate(111);
alert(oB2.getPrivate() +":"+ oB.getPrivate());
Privát láthatóságú tagváltozó a szülő konstruktorban statikus változóként viselkedik. Az oB.getPrivate() metódus 0 helyett 111-et ad vissza, pedig nem ezt vártuk. Ez azért van, mert mindkét gyerek objektum (oB és oB2) ugyanazt a ClassA függvény objektumot használja. Ha egy függvény objektumot örökíteni szeretnénk, ajánlott elkerülni lokális változók használatát a függvény konstruktorban.
A prototípus alapú öröklődés jellemzői:
- A leszármazott objektum tulajdonságai felülírják (override) a szülő objektum tulajdonságait.
- Ha a szülő objektumot utólag módosítjuk (a prototype tulajdonságán keresztül), az összes gyermek objektumban megjelenik a változtatás.
- Az öröklődési hierarchia bármilyen mély lehet – ClassA–ból származhat ClassB, ClassB-ből származhat ClassC, és így tovább.
- Csak egyszeres öröklődés lehetséges.