1. utilisez l'opérateur de propagation
const obj1 = { param: "value" };
const obj2 = { ...obj1 };
L'opérateur Spread prend tous les champs de obj1 et les répartit sur obj2. Dans le résultat, vous obtenez un nouvel objet avec une nouvelle référence et les mêmes champs que l'original.
Rappelez-vous qu'il s'agit d'une copie superficielle, cela signifie que si l'objet est imbriqué, ses paramètres composites imbriqués existeront dans le nouvel objet par la même référence.
2.Objet.assign ()
const obj1={ param: "value" };
const obj2:any = Object.assign({}, obj1);
Object.assign crée une copie réelle, mais uniquement ses propres propriétés, de sorte que les propriétés du prototype n'existeront pas dans l'objet copié. C'est aussi une copie superficielle.
3.Objet.create ()
const obj1={ param: "value" };
const obj2:any = Object.create(obj1);
Object.create ne fait pas de vrai clonage , il crée un objet à partir d'un prototype. Utilisez-le donc si l'objet doit cloner les propriétés de type principal, car l'attribution des propriétés de type principal n'est pas effectuée par référence.
Les avantages d' Object.create sont que toutes les fonctions déclarées dans le prototype seront disponibles dans notre objet nouvellement créé.
Peu de choses sur la copie superficielle
La copie superficielle place dans le nouvel objet tous les champs de l'ancien, mais cela signifie également que si l'objet d'origine a des champs de type composite (objet, tableaux, etc.), ces champs sont placés dans un nouvel objet avec les mêmes références. La mutation d'un tel champ dans l'objet d'origine sera reflétée dans le nouvel objet.
Cela ressemble peut-être à un écueil, mais en réalité, la situation où tout l'objet complexe doit être copié est rare. La copie superficielle réutilisera la plupart de la mémoire, ce qui signifie qu'elle est très bon marché par rapport à la copie profonde.
Copie profonde
L'opérateur d'étalement peut être pratique pour la copie profonde.
const obj1 = { param: "value", complex: { name: "John"}}
const obj2 = { ...obj1, complex: {...obj1.complex}};
Le code ci-dessus a créé une copie complète de obj1. Le champ composite «complexe» a également été copié dans obj2. Le champ de mutation "complexe" ne reflétera pas la copie.