In JavaScript werden alle Zuordnungen zwischen Objektvariablen durch Adressen weitergegeben. Einige Schüler können sich fragen, welche Objektobjekte sind. Es könnte besser sein, ein Beispiel zu geben:
Die Codekopie lautet wie folgt:
typeof (true) // "boolean"
Typof (1) // "Nummer"
Typof ("1") // "String"
typeof ({}) // "Objekt"
Typof ([]) // "Objekt"
Typof (NULL) // "Objekt"
typeof (function () {}) // "Funktion"
Tatsächlich ist das Objekt, das wir mit ausführlichem Kopieren zu tun haben Meine Idee, eine tiefe Replikation von JS implementieren zu können, ist:
Durch alle Eigenschaften dieses Objekts durchführen,
Wenn die Eigenschaft "Objekt" ist, ist eine spezielle Verarbeitung erforderlich.
Wenn dieses Objektobjekt etwas Besonderes ist und ein Array ist, erstellen Sie ein neues Array und kopieren Sie die Elemente im Array tief.
Wenn es sich bei diesem Objektobjekt um ein Nicht-Array-Objekt handelt, rufen Sie einfach die Deep Copy-Methode rekursiv darauf auf.
Wenn es kein "Objekt" ist, kopieren Sie es einfach normal.
Hier ist meine Implementierung:
Die Codekopie lautet wie folgt:
Object.Prototyp.deepcopy = function () {
var obj, ich;
obj = {};
für (attr in this) {
if (this.hasownProperty (attr)) {
if (typeof (this [attr]) === "Objekt") {
if (this [attr] === null) {
obj [attr] = null;
}
sonst if (Object.Prototype.toString.call (this [attr]) === '[Objektarray]') {
obj [attr] = [];
für (i = 0; i <this [attr] .Length; i ++) {
obj [attr] .push (this [attr] [i] .deepcopy ());
}
} anders {
obj [attr] = this [attr] .deepcopy ();
}
} anders {
obj [attr] = this [attr];
}
}
}
Rückkehr obj;
};
Wenn der Browser ECMascript 5 unterstützt, können Sie ihn verwenden, um alle Funktionen der Objekteigenschaften tief zu kopieren
Die Codekopie lautet wie folgt:
Object.DefineProperty (OBJ, Attr, Object.getownPropertyDescriptor (this, attr));
Ersetzen
Die Codekopie lautet wie folgt:
obj [attr] = this [attr];
Der Vorteil der Implementierung dieser Methode direkt auf Object.Prototyp ist, dass alle Objekte die Methode erben. Der Nachteil ist, dass einige Bibliotheken auch Objektobjekte neu schreiben, so dass manchmal Konflikte auftreten. Dies muss beachtet werden. Die spezifische Verwendungsmethode lautet wie folgt:
Die Codekopie lautet wie folgt:
Object.Prototyp.deepcopy = function () {...}
var a = {x: 1};
var b = a;
var c = a.deepcopy ();
ax = 2;
BX = 3;
console.log (ax); // 3
console.log (bx); // 3
console.log (cx); // 1
Das obige ist eine Erklärung zur tiefen Replikation. Da wir heute über tiefe Replikation gesprochen haben, möchten wir entsprechend flache Replikation haben. Fassen wir kurz die Ähnlichkeiten und Unterschiede zwischen ihnen zusammen.
Flache Kopie (Schattenklonen): Kopieren Sie nur den Grundtyp des Objekts und der Objekttyp gehört weiterhin zur ursprünglichen Referenz.
Deep Copy (Deep Cloning): Kopiert die Grundklasse des Objekts nicht, sondern kopiert auch die Objekte im ursprünglichen Objekt. Das heißt, es wird durch das neue Objekt vollständig erzeugt.