La meilleure façon de vérifier l'instance d'un objet est via l' opérateur instanceof ou avec la méthode isPrototypeOf () qui inspecte si le prototype d'un objet se trouve dans la chaîne de prototypes d'un autre objet.
obj instanceof jQuery;
jQuery.prototype.isPrototypeOf(obj);
Mais parfois, il peut échouer dans le cas de plusieurs instances jQuery sur un document. Comme l'a mentionné @Georgiy Ivankin:
si j'ai $
dans mon espace de noms actuel pointant vers jQuery2
et que j'ai un objet de l'espace de noms externe (où $
est jQuery1
) alors je n'ai aucun moyen d'utiliser instanceof
pour vérifier si cet objet est un jQuery
objet
Une façon de résoudre ce problème consiste à aliaser l'objet jQuery dans une fermeture ou IIFE
//aliases jQuery as $
(function($, undefined) {
/*... your code */
console.log(obj instanceof $);
console.log($.prototype.isPrototypeOf(obj));
/*... your code */
}(jQuery1));
//imports jQuery1
Pour résoudre ce problème, vous pouvez également demander à la jquery
propriétéobj
'jquery' in obj
Cependant, si vous essayez d'effectuer cette vérification avec des valeurs primitives, cela générera une erreur, vous pouvez donc modifier la vérification précédente en vous assurant obj
d'être unObject
'jquery' in Object(obj)
Bien que la méthode précédente ne soit pas la plus sûre (vous pouvez créer la 'jquery'
propriété dans un objet), nous pouvons améliorer la validation en travaillant avec les deux approches:
if (obj instanceof jQuery || 'jquery' in Object(obj)) { }
Le problème ici est que tout objet peut définir une propriété jquery
comme propre, donc une meilleure approche serait de demander dans le prototype, et de s'assurer que l'objet n'est pas null
ouundefined
if (obj && (obj instanceof jQuery || obj.constructor.prototype.jquery)) { }
En raison de la contrainte , la if
déclaration fera un court - circuit en évaluant l' &&
opérateur lorsque obj
est l' un des falsy valeurs ( null
, undefined
, false
, 0
,""
), et procède ensuite à effectuer les autres validations.
Enfin, nous pouvons écrire une fonction utilitaire:
function isjQuery(obj) {
return (obj && (obj instanceof jQuery || obj.constructor.prototype.jquery));
}
Jetons un coup d'œil à: Opérateurs logiques et vérité / fausse
selector
propriété a été dépréciée il y a longtemps et supprimée dans 3.0. Même dans les versions antérieures, un objet jQuery peut avoir une chaîne de sélecteur vide, par exemple$(window)
sans sélecteur. Utilisezinstanceof
plutôt.