Maison >interface Web >js tutoriel >Explication détaillée des méthodes extend() et fn.extend() dans jQuery_jquery
Ces deux méthodes utilisent le même code. L'une est utilisée pour fusionner des propriétés et des méthodes pour des objets jQuery ou des objets ordinaires. Voici quelques exemples d'utilisation de base :
Le code html est le suivant :
Fusionner deux objets ordinaires
Ajouter des propriétés ou des méthodes aux instances d'objets jQuery
Par défaut, l'objet à fusionner est modifié comme le résultat renvoyé. Si vous souhaitez simplement obtenir un objet fusionné mais ne souhaitez détruire aucun des objets d'origine, vous pouvez utiliser cette méthode
Si utilisé, fusion récursive ou copie profonde
Pour une utilisation détaillée, veuillez consulter le manuel de référence http://www.w3cschool.cc/manual/jquery/
Analysons comment il est implémenté dans le code source de la 1.7.1 :
Tout d'abord, un ensemble de variables est défini. Le nombre de paramètres étant incertain, l'objet arguments est directement appelé pour accéder aux paramètres passés
Options variables : pointe vers un objet source.
Nom de variable : représente un nom d'attribut d'un objet source.
Variable src : Représente la valeur originale d'un attribut de l'objet cible.
Copie variable : représente la valeur d'un attribut d'un objet source.
Variable copyIsArray : indique si la variable copy est un tableau.
Clone variable : représente la valeur de correction de la valeur originale lors de la copie profonde.
Cible variable : pointe vers l'objet cible.
Variable i : représente l'index de départ de l'objet source.
Longueur variable : indique le nombre de paramètres et permet de modifier la cible variable.
Variable deep : indique s'il faut effectuer une copie approfondie, la valeur par défaut est false.
Afin de mieux comprendre l'implémentation du code, voici un exemple donné ci-dessus à titre de démonstration pour observer l'exécution du code source
Analyse du code source
Déterminez s'il s'agit d'une copie profonde. Si le premier paramètre est une valeur booléenne, donnez la valeur du premier paramètre à deep, puis utilisez le deuxième paramètre comme objet cible. attribuez-le à un objet vide, remplacez l'indice de l'objet source par 2. Dans cet exemple, cela est fait ici car le premier paramètre est vrai, puis deep est modifié en vrai. La cible est modifiée par le deuxième paramètre. est obj1. L'indice de départ de l'objet source est 2, ce qui signifie commencer à partir du troisième comme objet source, qui est obj2
dans cet exemple.La cible est traitée davantage ici. L'ajout d'attributs personnalisés n'est pas valide pour les types de données non-objet et fonction. Par exemple, les chaînes peuvent appeler leurs propres méthodes et attributs
.Si l'attribut length est égal à la valeur de i, cela signifie qu'il n'y a pas d'objet cible. Dans des circonstances normales, la longueur devrait être supérieure à la valeur de i. Ensuite, utilisez-le comme objet cible à ce moment et réduisez-le. la valeur i par un pour obtenir la valeur de longueur supérieure à la valeur i (1 supérieure à i)
C'est le principe d'implémentation de la méthode jQuery d'extension des attributs à lui-même, tant que l'objet cible n'est pas transmis dans
Deux situations possibles : $.extend(obj) ou $.extend(false/true,obj);
这个部分就是此方法的核心了,从arguments对象的第i个下标值开始循环操作首先过滤掉源对象是nu ll或者是undefined的情况可以看到其实
源对象不一定真的就是对像,也可以是其他类型的值比如字符串比如这样写:
是不是感觉很奇怪啊?究竟是怎么实现的呢?下面接着看
的值,这两个键都是一样的
Si une certaine valeur d'attribut de l'objet source est l'objet cible, cela peut provoquer une boucle infinie et provoquer le crash du programme, donc une restriction est faite ici pour lui permettre de sauter cette boucle. Par exemple :
.Mais cela affectera également injustement certaines situations normales telles que :
Cette situation satisfait également que la valeur de l'objet source est égale à l'objet cible, mais il s'avère que la valeur de l'attribut a de obj1 n'a pas été modifiée, car continue est exécuté Ci-dessous, commentez ce paragraphe dans la source. code avant d'exécuter
Pour le moment, il a été modifié normalement. Je pense personnellement que ce domaine a besoin d'être amélioré
Ensuite, il y a un jugement if, qui consiste à distinguer s'il s'agit d'une copie profonde. Tout d'abord, ne regardez pas la copie profonde et regardez d'abord le général
.C'est très simple. Tant que la copie a une valeur, elle est copiée directement sur l'objet cible. Si l'objet cible a quelques modifications, il est ajouté de cette manière.
Après la boucle for, le nouvel objet cible est renvoyé, donc l'objet cible est finalement modifié et le résultat est le même que le résultat renvoyé.
Parlons de la façon de gérer la copie approfondie
Assurez-vous d'abord que deep est vrai, que la copie a une valeur et est un objet ou un tableau (s'il ne s'agit pas d'un objet ou d'un tableau, la copie profonde est hors de question), puis elle est traitée par des tableaux et des objets. au tableau en premier :
} autre {
clone = src && jQuery.isPlainObject(src) ?
>
Fusionnez ensuite de manière récursive la valeur d'attribut actuelle de l'objet source (qui est un tableau ou un objet) et l'attribut actuel de l'objet cible modifié et attribuez le nouveau tableau ou objet renvoyé à l'objet cible, pour finalement obtenir une copie approfondie.
Mais il y a ici un phénomène assez étrange, comme celui-ci :
L'objet source d'origine n'est pas nécessairement l'objet e, et la chaîne peut être divisée et fusionnée avec l'objet cible. Il s'avère que la boucle for...in fonctionne sur les chaînes
C'est également possible, il divisera la chaîne et la lira selon l'indice numérique, mais dans le code source
est limité aux tableaux et aux objets, cela n'aura donc aucun effet lors de la copie approfondie ?
Après mon test, la copie profonde est également possible, car la valeur copiée dans le code source s'est transformée en fonction anonyme
alert(jQuery.isPlainObject(copy)); //true
Quant à savoir pourquoi il s'agit d'une fonction, je ne l'ai pas encore compris et je le laisserai résoudre plus tard !