Eine besonders unelegante Lösung ist die Verwendung der JSON-Kodierung, um Kopien von Objekten zu erstellen, die keine Mitgliedsmethoden haben. Die Methode besteht darin, das Zielobjekt in JSON zu kodieren und dann durch Dekodierung die gewünschte Kopie zu erhalten. Sie können so oft dekodieren, wie Sie wollen, um so viele Kopien wie nötig zu erstellen.
Natürlich gehören Funktionen nicht in JSON, so dass dies nur bei Objekten ohne Membermethoden funktioniert.
Diese Methode war perfekt für meinen Anwendungsfall, da ich JSON-Blobs in einem Key-Value-Speicher speichere, und wenn sie als Objekte in einer JavaScript-API offengelegt werden, enthält jedes Objekt tatsächlich eine Kopie des ursprünglichen Zustands des Objekts, sodass wir das Delta berechnen können, nachdem der Aufrufer das offengelegte Objekt verändert hat.
var object1 = {key:"value"};
var object2 = object1;
object2 = JSON.stringify(object1);
object2 = JSON.parse(object2);
object2.key = "a change";
console.log(object1);// returns value
35 Stimmen
Siehe diese Frage: stackoverflow.com/questions/122102/
0 Stimmen
Unterstützen Sie auf jeden Fall @Niyaz! Shortlink: tinyurl.com/JSCopyObject
290 Stimmen
Für JSON verwende ich
mObj=JSON.parse(JSON.stringify(jsonObject));
79 Stimmen
Ich verstehe wirklich nicht, warum niemand vorschlägt.
Object.create(o)
dass es alles tut, was der Autor verlangt?5 Stimmen
@froginvasion Wahrscheinlich, weil es im IE8 und darunter nicht unterstützt wird.
4 Stimmen
@Wynand Das ist überhaupt kein gutes Argument. Es gibt eine Menge Polyfills für
Object.create
die zum Beispiel gefunden werden können: refheap.com/900061 Stimmen
@froginvasion In Ordnung, obwohl ich argumentieren könnte, dass der Auftraggeber eine "elegante" [ sic und nicht jeder würde notwendigerweise zustimmen, dass die Verwendung eines Polyfills dieser Beschreibung entspricht. Ich habe nur versucht, Ihnen Folgendes mitzuteilen a möglicher Grund dafür
Object.create
wurde nicht vorgeschlagen (falls dies der Fall ist), weshalb ich "wahrscheinlich" schrieb. Unabhängig davon bin ich für Polyfills und habe mir vor kurzem Folgendes angesehen diese eine, die übrigens ähnlich wie Ihr Schnipsel ist. Wenn Sie ein besseres Feedback wünschen, könnten Sie Ihren Vorschlag auch als Antwort hinzufügen.2 Stimmen
Object.create eignet sich hervorragend, wenn Sie den Prototyp Ihres Objekts kopieren möchten.
59 Stimmen
var x = { deep: { key: 1 } }; var y = Object.create(x); x.deep.key = 2;
Nachdem Sie dies getan haben,y.deep.key
wird auch 2 sein, daher kann Object.create NICHT zum Klonen verwendet werden...1 Stimmen
@froginvasion - weil es nicht einmal für flache Objekte funktioniert? (Chrome 45). Du bekommst einfach
__proto__
nicht ein Klon...2 Stimmen
Object.create
bekommt man nicht__proto__
wird ein neues Objekt erzeugt, dessen Prototyp auf das Argument verweist, wodurch eine Kette entsteht. Ich stimme zu, dass es sich vielleicht nicht um einen echten "Klon" im traditionellen Sinne handelt, aber je nach SituationObject.create
ist viel konsistenter als die verschiedenen Klontechniken, die im Folgenden verwendet werden. developer.mozilla.org/de-US/docs/Web/JavaScript/Reference/1 Stimmen
Wie wäre es mit
var newObj = (function(){ return oldObj; }());
23 Stimmen
@r3wt das wird nicht funktionieren... Bitte posten Sie erst, nachdem Sie einen grundlegenden Test der Lösung durchgeführt haben...
2 Stimmen
Hier ein Benchmark von verschiedenen Lösungen: jsben.ch/#/bWfk9
0 Stimmen
@RubenStolk warum kann OP das Objekt nicht in eine neue Variable speichern?
var copyobject=object
??4 Stimmen
@Mahi Dadurch wird das Objekt nicht kopiert. Es wird eine neue Variable erstellt, die auf das gleiche Objekt verweist.
0 Stimmen
@LordLoh. Was ist, wenn Sie in einer Javascript-Umgebung sind, in der Sie keine Bibliotheken wie JSON importieren können. Apples Quartz Composer Editor zum Beispiel, nicht sicher über Adobe CC Scripting.
1 Stimmen
developer.mozilla.org/de-US/docs/Web/JavaScript/Reference/ - Ich habe das gerade mit dem Chrome-Entwickler-Terminal ausprobiert -
oj1={}; oj1.p1=222; oj2={}; Object.assign(oj2,oj1); oj2.p1=555; oj1.p1;
- wird dies zeigen222
Auch hier wird geantwortet: stackoverflow.com/a/36177142/4821760 Stimmen
@LordLoh. Anscheinend kann ich JSON.parse und JSON.stringify doch innerhalb von QC aufrufen. Core Funktionen aufrufen. Auch habe ich dieses Polyfill auf der Referenzseite und Links zu erweiterten Polyfills JSON2 und JSON3 gefunden: developer.mozilla.org/de-US/docs/Web/JavaScript/Reference/
3 Stimmen
{...original}
6 Stimmen
Wenn Sie Object.create() vorschlagen, dann wissen Sie sehr wenig über JS. Mit Object.create wird das Objekt X nicht geklont. Y = Object.create(X) tut dies und nichts weiter: Es wird ein neues Objekt Y mit X als Prototyp erstellt. Das Objekt X wird zum Prototyp von Objekt Y. Das ist nicht das, was Sie wollen. Ganz und gar nicht. Da die Methoden und Daten von X nicht nach Y kopiert werden, sondern referenziert werden, enthält Y eine Referenz auf die Daten und Methoden von X. Wie falsch kann man liegen!?
0 Stimmen
Kürzlich beantwortete es über aquí
0 Stimmen
Ver developer.mozilla.org's JavaScript/Referenz von assign#Deep_Clone .
0 Stimmen
Dadurch sollte eine Kopie erstellt werden:
let y = {...x};
0 Stimmen
Sie können die Clone-Methode von Lodash oder den Spread-Operator verwenden let x = {} let y = {irgendein Wert} x = {...x, ...y}
0 Stimmen
stackoverflow.com/questions/38416020/