Es wird nicht empfohlen, Erweiterungen des Prototyps vorzunehmen. Dies führt zu Problemen, wenn Sie Tests an Ihrem Code / Ihren Komponenten durchführen. Die Unit-Test-Frameworks übernehmen nicht automatisch Ihre Prototyp-Erweiterungen. Es ist also keine gute Praxis. Weitere Erklärungen zu Prototypenerweiterungen finden Sie hier. Warum ist das Erweitern nativer Objekte eine schlechte Praxis?
Das Klonen von Objekten in JavaScript ist nicht einfach oder unkompliziert. Hier ist die erste Instanz, die "Shallow Copy" verwendet:
1 -> Flacher Klon:
class Employee {
constructor(first, last, street) {
this.firstName = first;
this.lastName = last;
this.address = { street: street };
}
logFullName() {
console.log(this.firstName + ' ' + this.lastName);
}
}
let original = new Employee('Cassio', 'Seffrin', 'Street A, 23');
let clone = Object.assign({},original); //object.assing() method
let cloneWithPrototype Object.create(Object.getPrototypeOf(original)), original) // the clone will inherit the prototype methods of the original.
let clone2 = { ...original }; // the same of object assign but shorter sintax using "spread operator"
clone.firstName = 'John';
clone.address.street = 'Street B, 99'; //will not be cloned
Ergebnisse:
original.logFullName ():
Ergebnis: Cassio Seffrin
clone.logFullName ():
Ergebnis: John Seffrin
original.address.street;
Ergebnis: 'Straße B, 99' // Beachten Sie, dass das ursprüngliche Unterobjekt geändert wurde
Hinweis: Wenn die Instanz Verschlüsse als eigene Eigenschaften hat, wird sie von dieser Methode nicht umbrochen. ( Lesen Sie mehr über Schließungen ) Außerdem wird das Unterobjekt "Adresse" nicht geklont.
clone.logFullName ()
wird nicht funktionieren.
cloneWithPrototype.logFullName ()
funktioniert, da der Klon auch seine Prototypen kopiert.
So klonen Sie Arrays mit Object.assign:
let cloneArr = array.map((a) => Object.assign({}, a));
Klonen Sie das Array mit ECMAScript Spread Sintax:
let cloneArrSpread = array.map((a) => ({ ...a }));
2 -> Deep Clone:
Um eine völlig neue Objektreferenz zu archivieren, können Sie JSON.stringify () verwenden, um das ursprüngliche Objekt als Zeichenfolge zu analysieren und es anschließend wieder in JSON.parse () zu analysieren.
let deepClone = JSON.parse(JSON.stringify(original));
Bei Deep Clone bleiben die Adressverweise erhalten. Die deepClone-Prototypen werden jedoch verloren gehen, daher funktioniert deepClone.logFullName () nicht.
3 -> Bibliotheken von Drittanbietern:
Eine weitere Option ist die Verwendung von Bibliotheken von Drittanbietern wie Loadash oder Unterstrich. Sie erstellen ein neues Objekt und kopieren jeden Wert vom Original in das neue Objekt, wobei die Referenzen im Speicher bleiben.
Unterstrich: let cloneUnderscore = _ (original) .clone ();
Loadash-Klon: var cloneLodash = _.cloneDeep (original);
Der Nachteil von lodash oder Unterstrich war die Notwendigkeit, einige zusätzliche Bibliotheken in Ihr Projekt aufzunehmen. Sie sind jedoch gute Optionen und führen auch zu Hochleistungsergebnissen.