Проверьте, является ли объект объектом 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')

Ответ 1

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

obj instanceof jQuery

Объяснение: функция jQuery (aka $) реализована как функция конструктора . Функции конструктора должны быть вызваны с префиксом new.

Когда вы вызываете $(foo), внутренне jQuery переводит это значение на new jQuery(foo) 1. JavaScript переходит к инициализации this внутри функции конструктора, чтобы указать на новый экземпляр jQuery, установив свойства для найденных в jQuery.prototype (aka jQuery.fn). Таким образом, вы получаете объект new, где instanceof jQuery - true.


1 Фактически new jQuery.prototype.init(foo): логика конструктора была выгружена в другую конструкторскую функцию под названием init, но концепция одинаков.

Ответ 2

Вы также можете использовать свойство .jquery, как описано здесь: http://api.jquery.com/jquery-2/

var a = { what: "A regular JS object" },
b = $('body');

if ( a.jquery ) { // falsy, since it undefined
    alert(' a is a jQuery object! ');    
}

if ( b.jquery ) { // truthy, since it a string
    alert(' b is a jQuery object! ');
}

Ответ 3

Обратитесь к instanceof.

var isJqueryObject = obj instanceof jQuery

Ответ 4

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

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

Но иногда это может быть неудачно в случае нескольких экземпляров jQuery в документе. Как отметил Георгий Иванкин:

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

Одним из способов преодоления этой проблемы является наложение объекта jQuery на closure или IIFE

//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)) { }

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

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

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

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

Ответ 5

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

Ответ 6

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

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

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

Ответ 7

Для тех, кто хочет знать, является ли объект объектом 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"];
}

Ответ 8

Вы можете проверить, создан ли объект JQuery, с помощью свойства jquery:

myObject.jquery // 3.3.1

=> вернуть номер версии JQuery, если объект создан JQuery. => в противном случае возвращает undefined

Ответ 9

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

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

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