javascript - name - Compruebe si el objeto es un objeto jQuery
jquery selector (8)
¿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 de arriba funciona pero no es seguro. Podrías agregar una tecla selectora al objeto o
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'')
Echa un vistazo a la instanceof operador.
var isJqueryObject = obj instanceof jQuery
La mejor manera de verificar la instancia de un objeto es a través de instanceof operator 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 mencionó @Georgiy Ivankin:
si tengo
$
en mi espacio de nombres actual que apunta ajQuery2
y tengo un objeto del espacio de nombres externo (donde$
esjQuery1
), no tengo forma de usarinstanceof
para verificar si ese objeto es un objetojQuery
Una forma de superar ese problema es mediante el alias del objeto jQuery en un closure 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 consultar la propiedad jquery
en obj
''jquery'' in obj
Sin embargo, si intenta realizar esa comprobación con valores primitivos, se producirá un error, por lo que puede modificar la comprobación anterior asegurando que obj
sea un Object
''jquery'' in Object(obj)
Aunque la forma anterior no es la más segura (puede crear la propiedad ''jquery''
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 esté null
o undefined
if (obj && (obj instanceof jQuery || obj.constructor.prototype.jquery)) { }
Debido a la coacción , la instrucción if
se cortocircuitará al evaluar el operador &&
cuando obj
sea cualquiera de los valores falsos ( null
, undefined
, false
, 0
, ""
) y luego proceda a realizar las otras validaciones.
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 truthy / falsy
Para aquellos que quieran saber si un objeto es un objeto jQuery sin tener instalado jQuery, el siguiente fragmento de código debería hacer el trabajo:
function isJQuery(obj) {
// Each jquery object has a "jquery" attribute that contains the version of the lib.
return typeof obj === "object" && obj && obj["jquery"];
}
Puede utilizar el operador instanceof
:
obj instanceof jQuery
Explicación : la función jQuery
(aka $
) se implementa como una función constructora . Las funciones de constructor se deben llamar con el new
prefijo.
Cuando llama a $(foo)
, jQuery lo traduce internamente a new jQuery(foo)
1 . JavaScript procede a inicializar this
dentro de la función del constructor para apuntar a una nueva instancia de jQuery
, estableciendo sus propiedades a las que se encuentran en jQuery.prototype
(también jQuery.fn
como jQuery.fn
). Por lo tanto, obtienes un new
objeto donde instanceof jQuery
es true
.
1 En realidad es new jQuery.prototype.init(foo)
: la lógica del constructor se ha descargado a otra función constructora llamada init
, pero el concepto es el mismo.
Sin embargo, hay una forma más de verificar el objeto en jQuery.
jQuery.type(a); //this returns type of variable.
He hecho un ejemplo para entender las cosas, jsfiddle link
También puede usar la propiedad .jquery como se describe aquí: http://api.jquery.com/jquery-2/
var a = { what: "A regular JS object" },
b = $(''body'');
if ( a.jquery ) { // falsy, since it''s undefined
alert('' a is a jQuery object! '');
}
if ( b.jquery ) { // truthy, since it''s a string
alert('' b is a jQuery object! '');
}
return el instanceof jQuery ? el.size() > 0 : (el && el.tagName);
var elArray = [];
var elObjeto = {};
elArray.constructor == Array //TRUE
elArray.constructor == Object//TALSE
elObjeto.constructor == Array//FALSE
elObjeto.constructor == Object//TRUE