Dans JavaScript, toutes les affectations entre les variables d'objet sont passées par le biais d'adresses. Certains élèves peuvent demander quels objets d'objets sont. Il pourrait être préférable de donner un exemple:
La copie de code est la suivante:
typeof (true) // "boolean"
typeof (1) // "numéro"
typeof ("1") // "String"
typeof ({}) // "objet"
typeof ([]) // "objet"
typeof (null) // "objet"
typeof (function () {}) // "fonction"
Ainsi, en fait, l'objet que nous devons traiter avec une copie approfondie est l'objet objet, et les objets non objets sont simplement affectés directement et normalement. Mon idée de mettre en œuvre une reproduction profonde de JS est:
Itérer à travers toutes les propriétés de cet objet,
Si la propriété est "objet", un traitement spécial est requis.
Si cet objet est spécial et est un tableau, créez un nouveau tableau et copiez profondément les éléments du tableau.
Si cet objet d'objet est un objet sans réseau, appelez simplement la méthode de copie profonde sur elle.
S'il n'est pas "objet", copiez-le normalement.
Voici mon implémentation:
La copie de code est la suivante:
Object.prototype.deepCopy = function () {
var obj, i;
obj = {};
pour (atTr dans ceci) {
if (this.hasownproperty (attr)) {
if (typeof (this [att]) === "objet") {
if (this [att] === null) {
obj [att] = null;
}
else if (object.prototype.tostring.call (this [att]) === '[Array d'objets]') {
obj [att] = [];
for (i = 0; i <this [attr] .length; i ++) {
obj [att] .push (this [att] [i] .deepCopy ());
}
} autre {
obj [att] = this [att] .deepCopy ();
}
} autre {
obj [att] = this [att];
}
}
}
retour obj;
};
Si le navigateur prend en charge Ecmascript 5, vous pouvez l'utiliser afin de copier profondément toutes les fonctionnalités des propriétés de l'objet
La copie de code est la suivante:
Object.defineProperty (obj, attr, object.getownProperTyDescriptor (this, att));
Pour remplacer
La copie de code est la suivante:
obj [att] = this [att];
L'avantage de l'implémentation de cette méthode directement sur objet.prototype est que tous les objets héritent de la méthode. L'inconvénient est que certaines bibliothèques réécrivent également des objets d'objets, donc parfois des conflits se produisent. Cela doit être prêté attention. La méthode d'utilisation spécifique est la suivante:
La copie de code est la suivante:
Object.prototype.deepcopy = function () {...}
var a = {x: 1};
var b = a;
var c = a.deepcopy ();
hache = 2;
bx = 3;
Console.log (AX); // 3
console.log (bx); // 3
console.log (CX); // 1
Ce qui précède est une explication sur la réplication profonde. Cependant, puisque nous avons parlé de la reproduction profonde aujourd'hui, nous voulons avoir une réplication superficielle en conséquence. Résumons brièvement les similitudes et les différences entre eux.
Copie peu profonde (clonage de l'ombre): Copiez uniquement le type de base de l'objet et le type d'objet appartient toujours à la référence d'origine.
Copie profonde (clonage profond): il ne copie pas la classe de base de l'objet, mais copie également les objets de l'objet d'origine. C'est-à-dire qu'il est complètement généré par le nouvel objet.