ugrás a tartalomhoz

Kérdések az javascript Object-el kapcsolatban,

therest · 2011. Okt. 31. (H), 16.01
Ha az alapobjektumot kibővítem egy új metódussal:

Object.prototype.alma = function() { };
Később ebből fakadóan az alma metódus minden helyen megjelenik, és ez sok problémát okoz. Például:

var xarray=new Array('a','n','s');
console.log(xarray.length);
for(i in xarray)
	console.log( typeof(xarray[i]) + ' ' +i + '=' + xarray[i]);
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.

var xobject={'prop1':'a','prop2':123};
for(i in xobject)
	console.log( typeof(xobject[i]) + ' ' +i + '=' + xobject[i]);
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.
 
1

hasownproperty lehet a te

Hidvégi Gábor · 2011. Okt. 31. (H), 16.18
hasownproperty lehet a te embered.
2

Ezt csak úgy tudod kivédeni

Karvaly84 · 2011. Okt. 31. (H), 17.06
Ezt csak úgy tudod kivédeni ha definiálsz mondjuk egy forIn metódust, globálisan vagy akár az Object.prototype-be (de ez nem javasolt), ami végig iterál az objektum tulajdonságain. A fentebb említett hasOwnProperty 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 egy for in ciklusban, ilyen pl a length többek között.
3

Egyébként pedig nagyon nem

Hidvégi Gábor · 2011. Okt. 31. (H), 18.16
Egyébként pedig nagyon nem célszerű a fő objektumok prototípusainak (Object, String stb.) kiegészítése, mert ha egy másik keretrendszert is használsz az oldalon, amelyik ugyanilyen módon egészíti ki ezeket az objektumokat (például ez is definiálja az Object.prototype.forEach() függvényt), akkor egymást felülírják a függvények, amiből nem biztos, hogy jó sül ki.

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.
4

Itt a weblaboron láttam egy

therest · 2011. Nov. 1. (K), 20.23
Itt a weblaboron láttam egy többszörös örököltetési módszert, ami az alapobjektum prototípusát bővítette, egy setPrototypes metódussal.

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!