Pregunta Compruebe si el objeto es un objeto jQuery


¿Existe una manera 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. Usted podría potencialmente agregar una clave selectora a la o objetar y obtener el mismo resultado. ¿Hay una forma mejor de asegurarse de que el objeto sea realmente un objeto jQuery?

Algo en línea con (typeof obj == 'jquery')


534
2017-12-05 19:43


origen


Respuestas:


Puedes usar el instanceof operador:

obj instanceof jQuery

Explicación: el jQuery función (aka $) se implementa como una función constructora. Las funciones del constructor deben ser llamadas con el new prefijo.

Cuando usted llama $(foo), internamente, jQuery traduce esto a new jQuery(foo)1. JavaScript procede a inicializar this dentro de la función constructora para apuntar a una nueva instancia de jQuery, estableciendo sus propiedades a las encontradas en jQuery.prototype (aka jQuery.fn) Por lo tanto, obtienes un new objeto donde instanceof jQuery es true.


1Es en realidad new jQuery.prototype.init(foo): la lógica del constructor se ha descargado a otra función del constructor llamada init, pero el concepto es el mismo


802
2017-12-05 19:48



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! ');
}

100
2018-06-22 18:13



Revisar la en vez de operador.

var isJqueryObject = obj instanceof jQuery

30
2017-12-05 19:53



La mejor forma de verificar la instancia de un objeto es mediante en vez de operador o con el método isPrototypeOf () que inspecciona si el prototipo de un objeto está en la cadena prototipo de otro objeto.

obj instanceof jQuery;
jQuery.prototype.isPrototypeOf(obj);

Pero a veces puede fallar en el caso de múltiples instancias de jQuery en un documento. Como @Georgiy Ivankin mencionó:

si tengo $ en mi espacio de nombre actual apuntando a jQuery2 y tengo un objeto del espacio de nombre externo (donde $ es jQuery1) entonces no tengo forma de usar instanceof para verificar si ese objeto es un jQuery objeto

Una forma de superar ese problema es aliando 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 investigando el jquery propiedad en obj

'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 previa garantizando obj ser un Object

'jquery' in Object(obj)

Aunque la forma anterior no es la más segura (puede crear el '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 propio, por lo que un mejor enfoque sería preguntar en el prototipo y asegurarse de que el objeto no sea null o undefined

if (obj && (obj instanceof jQuery || obj.constructor.prototype.jquery)) { }


20
2017-07-28 21:50



return el instanceof jQuery ? el.size() > 0 : (el && el.tagName);

3
2017-09-13 13:24



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 cosas, enlace jsfiddle


2
2017-08-17 10:06



Para aquellos que desean saber si un objeto es un objeto jQuery sin tener instalado jQuery, el siguiente fragmento 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"];
}

1
2017-12-15 05:20



var elArray = [];
var elObjeto = {};

elArray.constructor == Array //TRUE
elArray.constructor == Object//TALSE

elObjeto.constructor == Array//FALSE
elObjeto.constructor == Object//TRUE

-9
2017-10-18 21:13