Non è consigliabile creare estensioni del prototipo, ciò comporterà problemi quando farai test sul tuo codice / componenti. I framework di unit test non assumeranno automaticamente le estensioni del tuo prototipo. Quindi non è una buona pratica. Ci sono più spiegazioni delle estensioni dei prototipi qui Perché estendere gli oggetti nativi è una cattiva pratica?
Per clonare oggetti in JavaScript non esiste un modo semplice o diretto. Ecco una prima istanza che utilizza "Shallow Copy":
1 -> Clone superficiale:
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);
let cloneWithPrototype Object.create(Object.getPrototypeOf(original)), original)
let clone2 = { ...original };
clone.firstName = 'John';
clone.address.street = 'Street B, 99';
Risultati:
original.logFullName ():
risultato: Cassio Seffrin
clone.logFullName ():
risultato: John Seffrin
original.address.street;
risultato: "Street B, 99" // nota che l'oggetto secondario originale è stato modificato
Avviso: se l'istanza ha chiusure come proprietà proprie, questo metodo non la avvolgerà. ( leggi di più sulle chiusure ) Inoltre, il sottooggetto "indirizzo" non verrà clonato.
clone.logFullName ()
non funzionerà.
cloneWithPrototype.logFullName ()
funzionerà, perché il clone copierà anche i suoi prototipi.
Per clonare array con Object.assign:
let cloneArr = array.map((a) => Object.assign({}, a));
Clona array utilizzando la sintassi di diffusione ECMAScript:
let cloneArrSpread = array.map((a) => ({ ...a }));
2 -> Deep Clone:
Per archiviare un riferimento a un oggetto completamente nuovo possiamo usare JSON.stringify () per analizzare l'oggetto originale come stringa e dopo analizzarlo di nuovo in JSON.parse ().
let deepClone = JSON.parse(JSON.stringify(original));
Con il clone profondo i riferimenti all'indirizzo verranno conservati. Tuttavia, i prototipi di deepClone verranno persi, quindi deepClone.logFullName () non funzionerà.
Biblioteche 3 -> 3 ° partito:
Un'altra opzione sarà l'uso di librerie di terze parti come loadash o underscore. Creeranno un nuovo oggetto e copieranno ogni valore dall'originale al nuovo oggetto mantenendo i suoi riferimenti in memoria.
Sottolineato: let cloneUnderscore = _ (originale) .clone ();
Clone di Loadash: var cloneLodash = _.cloneDeep (originale);
Lo svantaggio di lodash o di sottolineatura era la necessità di includere alcune librerie extra nel tuo progetto. Tuttavia sono buone opzioni e producono anche risultati ad alte prestazioni.