Hi Ric
Kurtz beantwortet:
ok ich wollte dir ne kurze Antwort geben, aber ich muss etwas weiter ausholen.
ist aber gleichzeitig JS Form eines assoziativen Arrays!
Es ist eine "Form" assoziative Arrays zu realisieren, zumindest wirst du es sehr häufig in dieser Art sehen.
Das funtioniert auch sehr gut solange man auf bekannte hashkeys zugreift, leider herscht das Missverständnis (auch bei hiesigen "Kennern") das eine
for-in Schleife über die eigenen Schlüssel eines Hashes iterieren solle.
das ist leider falsch es iteriert über die eigenen und die geerbten Schlüssel, der in-Operator durchsucht den ganzen prototype-chain bis zum Top-Objekt. Es gibt leider kein "for-own" Befehl in JS.
Wenn du dich nicht mit OOP befassen willst kann es dir reichen einfach folgendes zu beherzen:
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
Object.prototype ist Tabu
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
Es ist IMHO leider auch nicht möglich einen Konstruktor (das Analoge zu Klassen in JS) zu generieren der nicht von Object() erbt, deswegen würde jedes for-in also auf die Schnauze fallen.
In den meisten Fällen begnügt man sich also damit {key:value} für Hashes zu nutzen und genau zu kontrollieren was Object vererbt. (die builin Attribute von Object werden von for-in nämlich GENAU FÜR DIESEN ZWECK ignoriert). Und dadurch das man das Top-Object der Vererbungskette nimmt, ist man auch sicher das kein Object in der Vererbungskette was reinschmuggelt.
Solltest du aber unbedingt Object.prototype verändern wollen, wird ein nacktes for-in für dich Tabu, du musst also sowas schreiben
for (variable in object) if (object.hasOwnProperty(variable)) {
statements;
}
Wenn dir das zu umständlich ist bleibt dir nur noch der Weg eine Wrapper-Funktionen zu bauen, die dies kapseln
also sowas wie ownValue(key,Object) oder sogar ein Objekt Hash konstruieren das eine Methode definiert Hash.ownValue(key) definiert hat und implizit auf hasOwnProperty prüft.
eine "Klasse" Hash die das for-in "problem" nicht hat, kann es leider nicht geben. Was aber in kontrollierten Fällen totaler Overhead ist.
Das Problem ist also nicht Object als Hash zu benutzen, sondern falsch auf die Werte zuzugreifen, udn z.B. for-in mit einem foreach wie z.B. in Perl zu verwechseln.
Das ist ein Designfehler in JS. Aber in den meisten Fällen kannst du es ziemlich genau kontrollieren, deswegen verzichten viele Progger aus Bequemlichkeit da auf das Sicherheitsnetz mit hasOwnProperty.
Hoffe du kannst nun deren Code besser verstehen.
Tschau
Kurt