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

582

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

  • 3
    Начиная с jQuery 3.0, это определенно не правильный способ проверить, является ли объект объектом jQuery, потому что свойство selector давно устарело и удалено в 3.0. Даже в более ранних версиях объект jQuery может иметь пустую строку селектора, например, $(window) не имеет селектора. Вместо этого используйте instanceof .
Теги:

9 ответов

865
Лучший ответ

Вы можете использовать оператор 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, но концепция одинаков.

  • 7
    Так что вы имеете в виду if (obj instanceof jQuery){...} ?
  • 2
    @NigelAngel: Да, это то, что он имеет в виду :)
Показать ещё 6 комментариев
109

Вы также можете использовать свойство .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! ');
}
  • 12
    Как указал в этом вопросе Дэвид , проверка свойства переменной, значение которой может быть равно нулю (т. Е. Если «a» или «b» были равны нулю), небезопасно (это вызовет ошибку TypeError). Лучше использовать "b instanceof jQuery".
  • 22
    Этот способ работает, если jQuery не загружен, тогда как b instanceof jQuery генерирует ReferenceError, если jQuery не доступен на странице. Оба подхода полезны в разных случаях.
Показать ещё 4 комментария
29

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

var isJqueryObject = obj instanceof jQuery
21

Лучший способ проверить экземпляр объекта - через 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));
}

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

  • 0
    Как это повышает безопасность, хотя? Не-jQuery объекты со свойством jquery все равно будут ошибочно обнаружены. Я не вижу, что еще, используя оба подхода, может «улучшиться».
  • 0
    это простой способ проверить, является ли объект объектом jQuery, если по какой-либо причине вы подозреваете, что кто-то создает объекты со свойствами, такими как jquery , то вы можете создать более надежный валидатор, т.е. проверять свойства в прототипе: myObj .constructor.prototype.jquery или еще лучше, вы можете использовать функцию Object.prototype.isPrototypeOf ()
Показать ещё 3 комментария
3

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

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

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

3
return el instanceof jQuery ? el.size() > 0 : (el && el.tagName);
  • 0
    Чтобы проверить наличие элемента DOM, лучше использовать свойство nodeType , а для обеспечения возврата boolean значения вы можете использовать двойное отрицание !!(el && el.nodeType)
2

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

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

myObject.jquery // 3.3.1

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

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

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

elObjeto.constructor == Array//FALSE
elObjeto.constructor == Object//TRUE
  • 9
    Дампы кода без объяснения редко бывают полезными. Пожалуйста, рассмотрите возможность добавления некоторого контекста к вашему ответу.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню