Проверьте, является ли объект объектом jQuery

есть ли быстрый способ проверить, является ли объект объектом jQuery или собственным объектом JavaScript?

пример:

var o = {};
var e = $('#element');

function doStuff(o) {
    if (o.selector) {
        console.log('object is jQuery');
    }
}

doStuff(o);
doStuff(e);

очевидно, что код выше работает, но это небезопасно. Вы можете потенциально добавить ключ селектора в o объект и получить тот же результат. Есть ли лучший способ убедиться, что объект действительно является объектом jQuery?

что-то в строку с (typeof obj == 'jquery')

8 ответов


можно использовать instanceof оператор:

obj instanceof jQuery

объяснение: the


вы также можете использовать .свойство jquery, как описано здесь: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! ');
}

Проверьте instanceof оператора.

var isJqueryObject = obj instanceof jQuery

лучший способ проверить экземпляр объекта через instanceof оператор или с помощью метода isPrototypeOf() который проверяет, находится ли прототип объекта в цепочке прототипов другого объекта.

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

но иногда это может привести к сбою в случае нескольких экземпляров jQuery в документе. Как отметил @Georgiy Ivankin:

если у меня есть $ в моем текущем пространстве имен указывая на jQuery2 и у меня есть объект из космического пространства (где $ is jQuery1), то у меня нет возможности использовать instanceof для проверки, является ли этот объект jQuery объект

один из способов преодолеть эту проблему-сглаживание объекта jQuery в закрытие или жизнь

//aliases jQuery as $
(function($, undefined) {
    /*... your code */

    console.log(obj instanceof $);
    console.log($.prototype.isPrototypeOf(obj));

    /*... your code */
}(jQuery1));
//imports jQuery1

другой способ преодолеть эту проблему-спросить jquery недвижимость в obj

'jquery' in obj

однако, если вы попытаетесь выполнить эту проверку с примитивными значениями, это вызовет ошибку, поэтому вы можете изменить предыдущую проверку, гарантируя obj быть Object

'jquery' in Object(obj)

хотя этот способ не самый безопасный (вы можете создать 'jquery' свойство в объекте), мы можем улучшить проверку, работая с обоими подходами:

if (obj instanceof jQuery || 'jquery' in Object(obj)) { }

проблема здесь в том, что любой объект может определить свойство jquery как собственный, поэтому лучшим подходом было бы спросить в прототипе и убедиться, что объект не null или undefined

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

Из-за принуждение, the if заявление сделает короткое замыкание путем оценивать && оператора obj любое ложь значения (null, undefined, false, 0, ""), а затем приступает к выполнению другого корректность.

наконец, мы можем записать функцию полезности:

function isjQuery(obj) {
  return (obj && (obj instanceof jQuery || obj.constructor.prototype.jquery));
}

давайте посмотрим на: логические операторы и истина / ложь


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

однако, есть еще один способ проверить объект в jQuery.

jQuery.type(a); //this returns type of variable.

Я сделал пример, чтобы понять вещи, jsfiddle link


для тех, кто хочет знать, является ли объект объектом jQuery без установки jQuery, следующий фрагмент должен выполнить работу:

function isJQuery(obj) {
  // Each jquery object has a "jquery" attribute that contains the version of the lib.
  return typeof obj === "object" && obj && obj["jquery"];
}

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

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

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