La mejor manera de verificar la instancia de un objeto es a través del operador instanceof o con el método isPrototypeOf () que inspecciona si el prototipo de un objeto está en la cadena de prototipos de otro objeto.
obj instanceof jQuery;
jQuery.prototype.isPrototypeOf(obj);
Pero a veces puede fallar en el caso de varias instancias de jQuery en un documento. Como @Georgiy Ivankin mencionó:
si tengo $
en mi espacio de nombres actual apuntando jQuery2
y tengo un objeto del espacio de nombres externo (donde $
está jQuery1
), entonces no tengo forma de usarlo instanceof
para verificar si ese objeto es un jQuery
objeto
Una forma de superar ese problema es aliasar el objeto jQuery en un cierre o IIFE
//aliases jQuery as $
(function($, undefined) {
/*... your code */
console.log(obj instanceof $);
console.log($.prototype.isPrototypeOf(obj));
/*... your code */
}(jQuery1));
//imports jQuery1
Otra forma de superar ese problema es preguntando la jquery
propiedad enobj
'jquery' in obj
Sin embargo, si intenta realizar esa comprobación con valores primitivos, arrojará un error, por lo que puede modificar la comprobación anterior asegurándose obj
de ser unObject
'jquery' in Object(obj)
Aunque la forma anterior no es la más segura (puede crear la 'jquery'
propiedad en un objeto), podemos mejorar la validación trabajando con ambos enfoques:
if (obj instanceof jQuery || 'jquery' in Object(obj)) { }
El problema aquí es que cualquier objeto puede definir una propiedad jquery
como propia, por lo que un mejor enfoque sería preguntar en el prototipo y asegurarse de que el objeto no null
seaundefined
if (obj && (obj instanceof jQuery || obj.constructor.prototype.jquery)) { }
Debido a la coacción , la if
declaración hará cortocircuito mediante la evaluación del &&
operador cuando obj
es cualquiera de los Falsy valores ( null
, undefined
, false
, 0
, ""
), y luego procede a realizar las validaciones otros.
Finalmente podemos escribir una función de utilidad:
function isjQuery(obj) {
return (obj && (obj instanceof jQuery || obj.constructor.prototype.jquery));
}
Echemos un vistazo a: Operadores lógicos y verdadero / falso
selector
propiedad fue obsoleta hace mucho tiempo y se eliminó en 3.0. Incluso en versiones anteriores, un objeto jQuery puede tener una cadena de selector vacía, por ejemplo,$(window)
no tiene selector. Usar en suinstanceof
lugar.