• Jetzt anmelden. Es dauert nur 2 Minuten und ist kostenlos!

wie geht das???

omoxen

Blogger
hallo, ich habe mir vor kurzem diese Funktion geschrieben:
Code:
fill = function(object, props)    {
            for    (var i in props)    {
                if    (typeof object[i] == "object")    {
                    object[i] = this.fill(object[i], props[i]);
                }    else    {
                    object[i] = props[i];
                }
            }
            return object;
        }
die Funktion füllt ein Objekt mit den Werten eines anderen Objektes. Vererbung sozusagen.
komischerweise funktioniert dabei folgendes:

a = {a:1,b:2};
b = {a:2};
fill(a, b);

lese ich jetzt a aus, ist a {a:2, b:2}
wie kann das sein, wenn ich a nicht zuweise?

Was außerdem komisch ist, dass sich alle objekte verändern, die ich vorher mit a gleich gesetzt habe:

a = {a:1,b:2};
b = {a:2};
c = a;
fill(a, b);

jetzt ist a {a:2, b:2} und c auch. Habe ich etwas an JavaScript nicht verstanden, oder was soll das?
 
Werbung:
Du hast etwas an JavaScript nicht verstanden. ;) Oder eigentlich an dem Weg, wie Objekte in der Vielzahl der Programmiersprachen verwaltet werden.

Wie es genau in JavaScript funktioniert, kann ich dir leider aus dem Stegreif nicht sagen, aber es ist ungefähr so:

Eine Objektvariable (etwa a in deinem Beispiel) enthält als Wert nicht die eigentlichen Objektdaten, sondern eine eindeutige Adresse, die bei Abruf intern vom Interpreter dazu eingesetzt wird, die tatsächlichen Objektdaten im Speicher zu identifizieren. Wenn du nun a einfach so kopierst (c = a), kopierst du nicht die Objektdaten, sondern lediglich diese Adresse. a und c zeigen also auf denselben Speicherbereich.

Shallow copy vs. deep copy.

- Object copy - Wikipedia, the free encyclopedia

Eine „Tiefenkopie“ eines Objekts inklusive aller seiner Daten wird auch „Klon“ genannt.

- Copying an Object in Javascript - Stack Overflow

PS: Schöner Threadtitel übrigens…
 
Werbung:
Zurück
Oben