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 jQuery2et que j'ai un objet de l'espace de noms externe (où $est jQuery1) alors je n'ai aucun moyen d'utiliser instanceofpour vérifier si cet objet est un jQueryobjet
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 jqueryproprié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 objd'ê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é jquerycomme propre, donc une meilleure approche serait de demander dans le prototype, et de s'assurer que l'objet n'est pas nullouundefined
if (obj && (obj instanceof jQuery || obj.constructor.prototype.jquery)) { }
En raison de la contrainte , la ifdéclaration fera un court - circuit en évaluant l' &&opérateur lorsque objest 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
selectorproprié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. Utilisezinstanceofplutôt.