¿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 o
objeto 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
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.Respuestas:
Puedes usar el
instanceof
operador:Explicación : la
jQuery
función (aka$
) se implementa como una función constructora . Las funciones de constructor deben llamarse con elnew
prefijo.Cuando llamas
$(foo)
, internamente jQuery traduce esto anew jQuery(foo)
1 . JavaScript procede a inicializarsethis
dentro 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 unnew
objeto dondeinstanceof jQuery
está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 jQuery
yajQuery
no tiene que ser declarado para que eltypeof
operador 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 jQuery
arroja 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)) {...
a
que sea un nodo DOM,document.body
y luego, teóricamente, existe la posibilidad de que lajquery
clave 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
jquery
propiedad enobj
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
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: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 nonull
seaundefined
Debido a la coacción , la
if
declaración hará cortocircuito mediante la evaluación del&&
operador cuandoobj
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:
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__.jquery
lugar deobj.constructor.prototype.jquery
suficiente? solo un poco corto :)constructor.prototype
porqueobj
se supone que es una instancia del constructor, es decirjQuery
. Por otro lado__proto__
está disponible para cualquier tipo de objeto.fuente
nodeType
propiedad y garantizarboolean
que 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
jquery
propiedad:=> devuelve el número de la versión de JQuery si el objeto producido por JQuery. => de lo contrario, devuelve
undefined
fuente
fuente