¿Existe una forma rápida de verificar si un objeto es un objeto jQuery o un objeto JavaScript nativo?
ejemplo:
var o = {};
var e = $('#element');
function doStuff(o) {
if (o.selector) {
console.log('object is jQuery');
}
}
doStuff(o);
doStuff(e);
obviamente, el código anterior funciona pero no es seguro. Potencialmente, podría agregar una tecla selectora al oobjeto y obtener el mismo resultado. ¿Hay una mejor manera de asegurarse de que el objeto sea realmente un objeto jQuery?
Algo en línea con (typeof obj == 'jquery')
javascript
jquery
David Hellsing
fuente
fuente

selectorpropiedad 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 suinstanceoflugar.Respuestas:
Puedes usar el
instanceofoperador:Explicación : la
jQueryfunción (aka$) se implementa como una función constructora . Las funciones de constructor deben llamarse con elnewprefijo.Cuando llamas
$(foo), internamente jQuery traduce esto anew jQuery(foo)1 . JavaScript procede a inicializarsethisdentro de la función constructora para apuntar a una nueva instancia dejQuery, estableciendo sus propiedades a las que se encuentran enjQuery.prototype(akajQuery.fn). Por lo tanto, obtienes unnewobjeto dondeinstanceof jQueryestátrue.1 En realidad es
new jQuery.prototype.init(foo): la lógica del constructor se ha descargado a otra función de constructor llamadainit, pero el concepto es el mismo.fuente
if (obj instanceof jQuery){...}?typeof jQuery === 'function' && obj instanceof jQueryyajQueryno tiene que ser declarado para que eltypeofoperador trabaje sin lanzar un error.También puede usar la propiedad .jquery como se describe aquí: http://api.jquery.com/jquery-2/
fuente
b instanceof jQueryarroja un ReferenceError si jQuery no está disponible en la página. Ambos enfoques son útiles en diferentes casos.try ... catch, particularmente en oldIE.if ((typeof jQuery !== 'undefined') && (obj instanceof jQuery)) {...aque sea un nodo DOM,document.bodyy luego, teóricamente, existe la posibilidad de que lajqueryclave de alguna manera llegue a estar en la parte superior de la cadena de ese nodo.Echa un vistazo a la instancia de operador.
fuente
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.
Pero a veces puede fallar en el caso de varias instancias de jQuery en un documento. Como @Georgiy Ivankin mencionó:
Una forma de superar ese problema es aliasar el objeto jQuery en un cierre o IIFE
Otra forma de superar ese problema es preguntando la
jquerypropiedad enobjSin embargo, si intenta realizar esa comprobación con valores primitivos, arrojará un error, por lo que puede modificar la comprobación anterior asegurándose
objde ser unObjectAunque 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:El problema aquí es que cualquier objeto puede definir una propiedad
jquerycomo propia, por lo que un mejor enfoque sería preguntar en el prototipo y asegurarse de que el objeto nonullseaundefinedDebido a la coacción , la
ifdeclaración hará cortocircuito mediante la evaluación del&&operador cuandoobjes 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:
Echemos un vistazo a: Operadores lógicos y verdadero / falso
fuente
||algo de eso con un'jquery' in Object(obj), sin embargo, se va a drenar, porque no evitará que los objetos que no son jQuery con esa propiedad pasen la verificación. Sin embargo, creo que verificar esa propiedad en el prototipo mejora la situación. ¡Quizás deberías agregar eso a tu respuesta! No creo que ninguna otra respuesta aquí mencione esa posibilidad :)obj.__proto__.jquerylugar deobj.constructor.prototype.jquerysuficiente? solo un poco corto :)constructor.prototypeporqueobjse supone que es una instancia del constructor, es decirjQuery. Por otro lado__proto__está disponible para cualquier tipo de objeto.fuente
nodeTypepropiedad y garantizarbooleanque se devuelva un valor, puede usar la negación doble!!(el && el.nodeType)Sin embargo, hay una forma más de verificar el objeto en jQuery.
He hecho un ejemplo para entender cosas, enlace jsfiddle
fuente
Para aquellos que desean saber si un objeto es un objeto jQuery sin tener jQuery instalado, el siguiente fragmento debe hacer el trabajo:
fuente
Puede verificar si el objeto es producido por JQuery con la
jquerypropiedad:=> devuelve el número de la versión de JQuery si el objeto producido por JQuery. => de lo contrario, devuelve
undefinedfuente
fuente