Je ne sais pas quand il a commencé, mais un nouveau mot est apparu dans le cercle frontal: clonage de profondeur d'objet. Il a l'air très grand, mais ce n'est pas nouveau en fait. Vous l'avez peut-être utilisé dans notre développement de projet réel, mais en raison de la profondeur des caractères chinois, certaines choses simples deviennent mystérieuses par un peu de vocabulaire apparemment professionnel.
Tout d'abord, pourquoi avez-vous besoin de clone profondément un objet? Veuillez me permettre de faire une supposition: vous pensez parfois que le document d'objet intégré de JS est trop long, alors vous pourriez le faire:
La copie de code est la suivante:
var d = document;
d.by = fonction (id) {
retour d.getElementById (id);
};
d.by ('id'). innerhtml = 'Hello SENTSIN';
Le code ci-dessus simplifie Document.getElementById, et ajoute également une méthode par membre à l'objet de document d'origine. Vous pouvez vérifier votre jugement en utilisant la valeur d'état renvoyée par document.hasownproperty ('by'). Jetons un coup d'œil à l'exemple suivant.
La copie de code est la suivante:
var person = {name: 'xianxin', profession: «développement frontal», lieu: «hangzhou»};
var newperson = personne;
NewSerson.age = '24';
console.log (personne);
Cette
On peut voir que lorsqu'un objet est simplement transmis à une nouvelle variable, c'est simplement un alias à l'objet. Cela signifie que la valeur de clé d'objet d'origine changera à travers l'opération sur l'alias. Mais le problème est que parfois nous voulons que le New Person soit complètement indépendant de la personne et qu'il n'y a pas de relation de synchronisation entre eux, nous devons donc générer une copie, veuillez consulter l'exemple:
La copie de code est la suivante:
var cloneoBj = fonction (obj) {
var str, newoBj = obj.constructor === Array? []: {};
if (typeof obj! == 'objet') {
retour;
} else if (window.json) {
str = json.stringify (obj), // objet sérialisé
newoBj = JSON.Parse (str); //Restaurer
} autre {
pour (var i dans obj) {
newObj [i] = typeof obj [i] === 'objet'?
clonoBj (obj [i]): obj [i];
}
}
retourner newoBJ;
};
//test
var obj = {a: 0, b: 1, c: 2};
var arr = [0, 1, 2];
// Exécuter un clonage profond
var newoBj = cloneoBj (obj);
var newarr = cloneoBj (arr);
// supprimer la suppression des membres du nouvel objet cloné
Supprimer NewoBJ.A;
Newarr.splice (0,1);
Console.log (Obj, Arr, Newobj, Newarr);
// Résultat: {a: 0, b: 1, c: 2}, [0, 1, 2], {b: 1, c: 2}, [1, 2];
Il s'agit du soi-disant clonage d'objets. Mais il y a quelques choses qui doivent être expliquées. L'objet JSON et ses méthodes de membre Stringify et l'analyse dans le code appartiennent à la spécification ECMAScript5. Ils sont responsables de la conversion d'un objet (y compris des objets de tableau) en chaînes et de leur restauration, réalisant ainsi une copie profonde de l'objet. Ainsi, pour les navigateurs de bas niveau (tels que IE), si vous copiez des tableaux, vous pouvez utiliser newoBj.concat (OBJ), et les objets ordinaires peuvent simplement énumérer et attribuer des valeurs.