Não é recomendado fazer extensões do Protótipo, isso vai resultar em problemas quando você fizer testes em seu código / componentes. Os frameworks de teste de unidade não assumirão automaticamente suas extensões de protótipo. Portanto, não é uma boa prática. Há mais explicações sobre extensões de protótipo aqui. Por que estender objetos nativos é uma prática ruim?
Para clonar objetos em JavaScript, não existe uma maneira simples ou direta. Aqui está a primeira instância usando "Cópia superficial":
1 -> Clone raso:
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: 'Street B, 99' // observe que o subobjeto original foi alterado
Aviso: Se a instância tiver fechamentos como propriedades próprias, este método não irá envolvê-la. ( leia mais sobre fechamentos ) E mais, o subobjeto "endereço" não será clonado.
clone.logFullName ()
não funciona.
cloneWithPrototype.logFullName ()
funcionará, porque o clone também copiará seus protótipos.
Para clonar matrizes com Object.assign:
let cloneArr = array.map((a) => Object.assign({}, a));
Array clone usando a sintaxe de propagação ECMAScript:
let cloneArrSpread = array.map((a) => ({ ...a }));
2 -> Clone Profundo:
Para arquivar uma referência de objeto completamente nova, podemos usar JSON.stringify () para analisar o objeto original como string e depois analisá-lo de volta para JSON.parse ().
let deepClone = JSON.parse(JSON.stringify(original));
Com o clone profundo, as referências ao endereço serão mantidas. No entanto, os Protótipos deepClone serão perdidos, portanto, o deepClone.logFullName () não funcionará.
3 -> Bibliotecas de terceiros:
Outra opção será usar bibliotecas de terceiros, como loadash ou sublinhado. Eles irão criar um novo objeto e copiar cada valor do original para o novo objeto mantendo suas referências na memória.
Sublinhado: deixe cloneUnderscore = _ (original) .clone ();
Clone Loadash: var cloneLodash = _.cloneDeep (original);
A desvantagem do lodash ou do sublinhado foi a necessidade de incluir algumas bibliotecas extras em seu projeto. Porém são boas opções e também produzem resultados de alto desempenho.