JavaScript öröklődés
Tudom.. szegénységi bizonyítvány, DE igazán most szembesültem vele, hogy nem tudom, hogy lehet egy származtatott JS objektumból meghívni az ős (időközben felülírt) metódusát. Pl:Kérdés: van-e ennél szebb megoldás, ha nincs, akkor miért nincs? :) Ugyanez aprobléma akonstruktorral...
■
Szulo = function() {
}
Szulo.prototype.metodus = function (a, b) {
}
Gyerek = function() {
}
Gyerek.prototype = new Szulo();
Gyerek.prototype.metodus = function (a, b, c) {
// itt valami feldolgozás
Szulo.prototype.metodus.call(this, a, b);
}
pedig én is kiváncsi voltam
szóval a konstruktorokat még csak-csak összeláncolom
http://dean.edwards.name/weblog/2006/03/base/
http://javascript.crockford.com/inheritance.html
utóbbi kommentezve is megtalálható a CHAPTER 3 - Creating Reusable Code alatt
üdv Csaba
john resig szerint base a nyerő
Üdv,
Felhő
Első megoldás
Persze az a szörnyen idegesítő dolog így is benne van a dologban, hogy létrehozunk egy Szulo példányt, a prototípust, ami így paraméterek nékül hibásan és persze fölöslegesen inicializálódik, hacsak nem kezeljük le ezt is külön a konstruktorban, ami az egyik legidegesítőbb dolog.
Ezért a prototípust így is létrehozhatjuk:
Kutakodtam
Köszi
Talán el kéne felejteni mindent, amit az OO-ról tudunk, és megtanulni prototípus-orientáltan(?) programozni. A kérdés csak az, hogy olyat hogy kell... :)
Az egész dolog azért jött elő mert egy nagyobb kliensoldali alkalmazás előtt állok. Kíváncsi lennék, hogy mások hogyan írnak "nagyobb" kódokat ezzel az izével.
open laszlo, .NET megoldása
http://weblog.openlaszlo.org/archives/2006/02/class-based-oop-in-javascript-done-right/
Ezenkívül szerintem amit még érdmes megnézned az a .NET Ajax része. Elvileg ott megcsinálták a .NET framework egy részének portolását, amihez elkészült egy olyan réteg is, ami támogatja az OOP-t. Sajnos már erről is csak ennyi rémlik, de az valszeg egy elég mature megoldás lehet, ha utána tudtak rá építeni.
Üdv,
Felhő
AJS
Köszi
a 4. sorban a return-t nem igazán értem.
szép is ezen gondolkozni :)
üdv Csaba
Hazudnék
melyik része
üdv Csaba
Még egyszer nekiugrom majd...
Második megoldás
és ilyenkor miért ez történik ? ]:)
Gyerek konstruktor: 3, 4
Szulo konstruktor: 3, -1
Gyerek metodus: 5
Szulo metodus2: -1
Szulo metodus2: undefined
false
magyarán nálad a
i utolsó lehetséges értékét tárolta for-al töltött változoknál a scope elkapás nem müxik, ezért a
Szulo konstruktor: 3, -1
Gyerek metodus: 5
Szulo metodus: -1
Szulo metodus2: -1
true
ami nekem jobban tetszik, másrészt a base-ből hívott return-al visszaadott értékeket is le kéne tudni kezelni,
nézd : o.metodus2()-> Gyerek.metodus2 -> Szulo.prototype.metodus2
Szulo konstruktor: 3, -1
Gyerek metodus: 5
Szulo metodus: -1
undefined
true
javítás, i elé azért teszek egy var-t ne szennyezzünk
Szulo konstruktor: 3, -1
Gyerek metodus: 5
Szulo metodus: -1
Szulo metodus2: -1
true
üdv Csaba
folyt: 12-es ben,
cserébe javítottam az enyémet is egy picit, most annak kimenetet is un. mint ennek, van benne egy csak örökösítést szolgláló konstruktor hívás... most ugyanott tartunk, csak én bemásoltam az adott proto-ba az szülő elem adott metódusát hívó függvényt, nálam nincs külön this.base.foo hanem this._base_foo -n keresztül lehet un. csinálni, kivéve
itt this.baseConstructor van és nincs this.base.construct vs nálam this._base_constr is van :)
Két pont
Effektív különbség kevés van a két megközelítés között, ami erénye az általam felvázolt módszernek, hogy a this.base-en keresztül bármelyik metódust lehe hívni az "ősosztályból", olyat is, amit nem írtunk felül. (Így mobilisabb a kód).
írnál erre példát
b
bb
a
végig öröklődőtt C-ből is elérhető
nem irtam felül,átöröklődött C-be is
true
kérdéses ugye B:methodAA
üdv Csaba
Amire gondolok
Persze, lehet azt mondani, hogy körültekintően kell refaktorizálni, de én fontosak érzem, hogy ami egyszer működött, az mindig működjön. (Más kérdés, hogy kifejezetten nevelő hatású lehet, ha rá van kényszerítve a felhasználó, hogy időről időre átböngéssze a kódját :)
OFF: szigorítás öröklődéskor
Üdv,
Felhő
Bocsánat :)