Hallo 
Ich habe leider ein Problemchen mit dem Klonen von Objekten.
Zuerst mal ein Beispiel, wo alles so funktioniert, wie man es sich erwartet:
Dieses Script funktioniert allerdings nur mit Google Chrome. Die anderen Browser können mit "class" noch nicht umgehen.
Hier habe ich eine Methode "clone". Darin erstelle ich eine Kopie der aktuellen Instanz und gebe sie zurück.
Auf der Konsole werden die id´s so ausgegeben, wie man sich das erwartet.
Nun lasse ich die Klasse C unverändert, schreibe aber das Hauptprogramm ein wenig um.
Jetzt arbeite ich mit Arrays und der clone-Methode:
In der ersten Konsole-Ausgabe passt wieder alles, in der zweiten jedoch nicht. 101 und 100 stimmen, die 0 jedoch nicht. Die 0 zeigt, dass ein geklontes Objekt immer noch auf ein Original-Objekt verweist. Und das will ich nicht. Es soll auf das entsprechende Objekt im geklonten Array verweisen.
Wie löst man dieses Problem denn am Besten?
Ich habe leider ein Problemchen mit dem Klonen von Objekten.
Zuerst mal ein Beispiel, wo alles so funktioniert, wie man es sich erwartet:
PHP:
<script>
"use strict";
class C {
constructor(id) {
this.id = id;
this.next = null; // Verweis auf eine weitere C-Instanz
}
clone(id) { // eine Kopie der aktuellen C-Instanz erstellen und zurückgeben
let o = new C(id);
o.next = this.next; // null oder ein Objekt vom Typ C
return o;
}
}
let o0 = new C(0);
let o1 = new C(1);
o1.next = o0;
console.log(o1.id, o1.next.id, o0.id); // 1 0 0
</script>
Hier habe ich eine Methode "clone". Darin erstelle ich eine Kopie der aktuellen Instanz und gebe sie zurück.
Auf der Konsole werden die id´s so ausgegeben, wie man sich das erwartet.
Nun lasse ich die Klasse C unverändert, schreibe aber das Hauptprogramm ein wenig um.
Jetzt arbeite ich mit Arrays und der clone-Methode:
PHP:
<script>
"use strict";
class C {
constructor(id) {
this.id = id;
this.next = null; // Verweis auf eine weitere C-Instanz
}
clone(id) { // eine Kopie der aktuellen C-Instanz erstellen und zurückgeben
let o = new C(id);
o.next = this.next; // null oder ein Objekt vom Typ C
return o;
}
}
let a = [new C(0), new C(1)]; // Array
a[1].next = a[0];
console.log(a[1].id, a[1].next.id, a[0].id); // 1 0 0
// Eine Kopie des Arrays erstellen:
let clonedA = [];
for(let i = 0; i < a.length; ++i) {
clonedA[i] = a[i].clone(100 + i);
}
console.log(clonedA[1].id, clonedA[1].next.id, clonedA[0].id); // 101 0 100
</script>
Wie löst man dieses Problem denn am Besten?