Težave z Array.prototype

Nikakor ne morem pogruntati zakaj naslednja koda ne deluje pravilno:

Array.prototype.dummy = function() {
return this;
};

String.prototype.dummy = function() {
return this;
};

var a = new Array("a", "b", "c");
for(var i in a) {
document.write(a*);
}

Koda vrne kot rezultat:

function() { return this; }abc

pričakoval pa bi izpisati samo abc!!! Če delam s String.prototype stvar dela pravilno. Je imel že kdo take težave, kot sem videl okoli se Array.prototype na veliko uporablja. Testirano na IE6, FF2

LP*

5 odgovorov

Zakaj tukaj sploh potrebujes to dummy funkcijo?

Koda, ki bo izpisala "abc":

for (var i = 0; i < a.length; i++) {
    document.write(a[ i ]);
}

Pazi, "for (var i in a)" v tvojem primeru ne pride v postev, ker se sprehodi skozi vse propertyje objekta, torej tudi skozi property "dummy" in ja, indeksi arraya so prav tako propertyji v javascriptu.

dummy je lahko katerakoli dodatna funkcija na Array-ju, ki jo sam napišem, npr. in_array, search, ...

for zanka sicer deluje, vendar samo pri numeričnem indeksiranju, če definiram:
var a = new Array();
a["x"] = "a";
a["y"] = "b";
a["z"] = "c";

stvar ne bo tekla. "for (var i in a)" se mi zdi točno tisto kar rabim (brez propertyjev), ker prebere tudi indekse/ključe, vendar je zadeva za moje pojme nekoliko pomanjkljiva.

Hvala

Pazi, javascript Array je kar objekt, le da ima se dodaten property .length, ki pove, kako dolg je ta array. Ampak spet pazi, javascript hash (associative) arrayev ne podpira, ko si storil a["x"] = "a", si priredil vrednost propertyju objekta, vrednost .length se zaradi tega ne bo povecala.

Problem bi lahko resil takole:

var akeys = [];
var a = [];
a["x"] = "a";
akeys[akeys.length] = "x";
a["y"] = "b";
akeys[akeys.length] = "y";
a["z"] = "c";
akeys[akeys.length] = "z";

for (var i in akeys) {
    document.write(a[ akeys[ i ] ]);
}

Je pa vprasanje, ce je to sprejemljivo zate. Vsekakor moras, ko setiras propertyje, v akeys dodajati se imena teh propertyjev, da se lahko kasneje sprehodis samo po tem.

Mogoce bi bilo boljse, ce poves, kaj sploh zelis doseci, pa pogruntamo najbolj optimalen workaround...

Stvar je sledeča:

Imam že kar nekaj napisane kode v JS in na več mestih uporabljam kar "for (var i in a)" sintakso. Želel sem globalno dodati še Array.prototype.in_array (pred tem nisem imel custom funkcij an Array objektu) in stvar se je začela sesuvati.

Imam torej dve možnosti: ali povsod preiskati uporabo "for (var i in a)", jo zamenjati in še enkrat stestirati ali pa na mestih kjer rabim in_array vsakič pisati isto kodo.

Nobena varianta mi ne diši... če bi tole prej vedel... Mogoče bo pa komu drugemu tole pomagalo, ko bo zažel JS knjižnico pisati.

LP

Ja, ni druge, eno od teh dveh moznosti bos moral izbrati, v drugem primeru lahko le naredis funkcijo in_array(), da ne bos pisal ene in iste kode kar naprej :)