Javascript Objektumok származtatása
Sziasztok!
Az objektumok öröklésének utolsó lépésénél vagyok elakadva. Igazából nem értem annak szükségességét, mivel nélküle is tökéletesen működik!
Tehát ahogy én szoktam:Mások (a dokumentációk ezt megtoldják egy sorral)A kérdésem a következő! Minek az utolsó sor? ClassB.prototype = new ClassA(); Az utolsó sor nélkül is tökéletes az öröklés. A gyerekben való módosítgatások nem lessznek hatással a szülőre és egy mésik gyerekben való módosítgatás sem befoljásolja az egyik gyereket!
A magyarázatot előre is köszönöm!
■ Az objektumok öröklésének utolsó lépésénél vagyok elakadva. Igazából nem értem annak szükségességét, mivel nélküle is tökéletesen működik!
Tehát ahogy én szoktam:
//létrehozom az ősosztályt
function ClassA(a){
this.a = a;
}
//létrehzozok mégegyet az érdekesség kedvéért
function ClassB(a){
this.b = a;
}
//Aztán létrehzom a gyerek osztályt kiterjesztve a fent látrehozott 2 szülővel
function ClassC(a, b){
ClassA.call(this, a);
ClassB.call(this, b);
this.getA = function(){
return this.a;
};
//csinálok valami saját metódusokat, hogy válztozzon
this.getB = function(){
return this.b;
};
this.setA = function(a){
this.a = a;
};
this.setB = function(b){
this.b = b;
};
}
//aztán hogy a teszt kiterjettebb legyen a gyereknek a prototypeön keresztűl is
//definiálok mégy egy metódust
ClassC.prototype.bakker = function(){
return this.a+"; "+this.b
}
//aztán létrehozok valami ojjektumokat
var ca = new ClassA(555);
var bakker = new ClassC(1, 2);
var bakker1 = new ClassC(3, 4);
//aztán csinálok valami beállításokat csak, hogy tesztelhessem, hogy az egyik
//ojjektumban való módosítgatások változással lessznek-e egy másik gyerekre
//mert ugye a setA az egyik szülő mezőjét változtatja
bakker.setA(8);
//aztán szépen kiíratom, hogy lám mi történik és minden tökéletesen megy
alert(bakker.bakker()+"; "+bakker1.bakker()+"; "+ca.bakker);
function ClassA(a){
this.a = a;
}
function ClassB(a){
ClassA.call(this, a);
//....
}
// s akkor itt jön, amit én nem értek
ClassB.prototype = new ClassA();
A magyarázatot előre is köszönöm!
prototype chain, OOP inheritance
, de lehet a klasszikus OOP öröklődést is szimulálni js alatt
üdv Csaba
ps: amire még érdemes figyelni az a proto-ból örökölt tagok aszimmetrikus írás/olvasása lap aljától
lehet, hogy csak én vagyok túl fáradt hozzá :)
sóval:
Felfogtam, hogy prototype láncolaton keresztűl a konstruktor nem oda fog mutatni, ahova szeretnénk ézért szintén a prototypeon keresztül meg kell mutassuk a konstruktornak hogy hé te figyu...?! Ide mutass ne oda, mert az oda az nem te vagy.
Viszont a kérdésem arra szóllt, hogy a construktor ide oda mutogatásának a beállításán túl a:
Kihangsulyozom: ha nem akarok a konstruktor után állítani.
Tehát az alábbi 2 kód miben külömbözik?!
Ez:
Prototípus alapú öröklődés
Kiterjesztett.prototype = new Szulo();
valósítja meg magát a származtatást, enélkül a Szulo metódusai maradnának ahol vannak. Így kásőbb is ráaggathatunk metódusokat a szülőre, az látszani fog minden leszármazottban.Az, hogy a konstruktorban "gyúrjuk össze" az objektumot, annak ügyes kihasználása, hogy szkriptnyelvről van szó, ha jól valósítod meg, kiköszöblheted hogy valaha is hallj a "prototype"-ról, de ha szeretnéd kihasználni a prototípus alapú öröklődés előnyeit... megteheted.
Javascript prototype versus closure execution speed
On Firefox 1.5.0.9 the difference is in the listed example is even larger with the closure taking 515ms and prototype still around 140ms.
For small applications that don't construct hundreds or thousands of the same type of object the execution speed difference between closure and prototype probably doesn't matter so as with all performance advice measure, measure, measure.
http://blogs.msdn.com/kristoffer/archive/2007/02/13/javascript-prototype-versus-closure-execution-speed.aspx
szóval érdemes méricskélni, és nem száműzni agyunk poros padlására a prototype -ot :), üdv Csaba
re
attól, hogy
üdv Csaba
ui.: további érdekességek a js világából, a YUI moziban Douglas Crockford — Advanced JavaScript , nem új de aktuálist, thx ie6 ...
Hatalama téháx! De inkább köszönöm!!!