Kérdések az javascript Object-el kapcsolatban,
Ha az alapobjektumot kibővítem egy új metódussal:Később ebből fakadóan az alma metódus minden helyen megjelenik, és ez sok problémát okoz. Például:A length 3-at ad vissza, viszont a ciklus 4 elemet jelenít meg, az utolsó az alma függvény.
Tehát tömb objektumoknál nem is okoz akkor gondot, mert a length-ből tudom meddig van valós tömb adat.
Ahol már nagyobb gond ott van ahol property szerűen vannak adatok egy objektumban.Itt ugyanis a length már nem értelmezett.
Persze lehet vizsgálni xobject[i]-t typeof-al, és az első function típusú elemnél kilépni a ciklusból, azonban ez nem tűnik szépnek. Illetve mi van, ha az objetum saját metódusain szeretnék iterálni, de az ősökén nem.
Arra lennék kíváncsi, hogy ki lehet e bővíteni az alapobjektumot úgy, hogy ez viselkedés ne jelentkezzen. Ahogy mondjuk a a toStinget,a length-jét sem kezeli ilyen módon. Vagy a programozó által definiált metódusok esetében ez elkerülhetetlen? Mint fentebb írtam typeof-al megoldom, csak biztosan van szebb módja is.
■
Object.prototype.alma = function() { };
var xarray=new Array('a','n','s');
console.log(xarray.length);
for(i in xarray)
console.log( typeof(xarray[i]) + ' ' +i + '=' + xarray[i]);
Tehát tömb objektumoknál nem is okoz akkor gondot, mert a length-ből tudom meddig van valós tömb adat.
Ahol már nagyobb gond ott van ahol property szerűen vannak adatok egy objektumban.
var xobject={'prop1':'a','prop2':123};
for(i in xobject)
console.log( typeof(xobject[i]) + ' ' +i + '=' + xobject[i]);
Persze lehet vizsgálni xobject[i]-t typeof-al, és az első function típusú elemnél kilépni a ciklusból, azonban ez nem tűnik szépnek. Illetve mi van, ha az objetum saját metódusain szeretnék iterálni, de az ősökén nem.
Arra lennék kíváncsi, hogy ki lehet e bővíteni az alapobjektumot úgy, hogy ez viselkedés ne jelentkezzen. Ahogy mondjuk a a toStinget,a length-jét sem kezeli ilyen módon. Vagy a programozó által definiált metódusok esetében ez elkerülhetetlen? Mint fentebb írtam typeof-al megoldom, csak biztosan van szebb módja is.
hasownproperty lehet a te
Ezt csak úgy tudod kivédeni
forIn
metódust, globálisan vagy akár azObject.prototype
-be (de ez nem javasolt), ami végig iterál az objektum tulajdonságain. A fentebb említetthasOwnProperty
metódus eldönti, hogy egy tulajdonság az objektum saját tulajdonsága e vagy örökölt, ez alapján rá lehet engedni egy callback-ot az adott tulajdonságot paraméterül adva. Továbbá vannak olyan tulajdonságok amik nem látszanak egyfor in
ciklusban, ilyen pl alength
többek között.Egyébként pedig nagyon nem
Az Ext.js keretrendszer készítői ugyanebbe a hibába futottak bele, emiatt a 4.0-ban át kellett fésülniük a több megás kódot, és javítani az egészet.
Itt a weblaboron láttam egy
http://weblabor.hu/blog/20100520/javascript-oroklodes
Nekem eléggé szimpatikus a megközelítés (mivel egyszerűbbet nem igen láttam sehol), eltekintve a fenti jelenségtől.
Tehát sok helyen nem akadhat össze más kódokkal. A saját függvény az iterálásra nem olyan elegáns, de ha nincs más út, akkor marad ez.
Ha valakinek más tippje lenne, szívesen olvasnám, az eddigieket kösz!