No se recomienda hacer extensiones del prototipo, dará lugar a problemas cuando realice pruebas en su código / componentes. Los marcos de prueba unitarios no asumirán automáticamente sus extensiones de prototipo. Entonces no es una buena práctica. Hay más explicaciones sobre las extensiones de prototipos aquí. ¿Por qué es una mala práctica extender objetos nativos?
Para clonar objetos en JavaScript no existe una forma simple o directa. Aquí está la primera instancia que usa "Copia superficial":
1 -> Clon superficial:
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';
Resultados:
original.logFullName ():
resultado: Cassio Seffrin
clone.logFullName ():
resultado: John Seffrin
original.address.street;
resultado: 'Calle B, 99' // observe que se cambió el subobjeto original
Aviso: si la instancia tiene cierres como propiedades propias, este método no la ajustará. ( lea más sobre cierres ) Y además, el subobjeto "dirección" no será clonado.
clone.logFullName ()
no trabajará.
cloneWithPrototype.logFullName ()
funcionará, porque el clon también copiará sus Prototipos.
Para clonar matrices con Object.assign:
let cloneArr = array.map((a) => Object.assign({}, a));
Clonar matriz usando ECMAScript spread sintax:
let cloneArrSpread = array.map((a) => ({ ...a }));
2 -> Clon profundo:
Para archivar una referencia de objeto completamente nueva, podemos usar JSON.stringify () para analizar el objeto original como una cadena y luego volver a analizarlo en JSON.parse ().
let deepClone = JSON.parse(JSON.stringify(original));
Con la clonación profunda se mantendrán las referencias a la dirección. Sin embargo, los prototipos deepClone se perderán, por lo que deepClone.logFullName () no funcionará.
3 -> Bibliotecas de terceros:
Otras opciones serán utilizar bibliotecas de terceros como loadash o subrayado. Crearán un nuevo objeto y copiarán cada valor del original al nuevo objeto manteniendo sus referencias en la memoria.
Guión bajo: deje cloneUnderscore = _ (original) .clone ();
Clon de carga: var cloneLodash = _.cloneDeep (original);
La desventaja de lodash o subrayado fue la necesidad de incluir algunas bibliotecas adicionales en su proyecto. Sin embargo, son buenas opciones y también producen resultados de alto rendimiento.