Есть ли быстрый способ проверить, является ли объект объектом 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')
Вы можете использовать оператор 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
, но концепция одинаков.
if (obj instanceof jQuery){...}
?
Вы также можете использовать свойство .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! ');
}
b instanceof jQuery
генерирует ReferenceError, если jQuery не доступен на странице. Оба подхода полезны в разных случаях.
Обратитесь к instanceof.
var isJqueryObject = obj instanceof jQuery
Лучший способ проверить экземпляр объекта - через instanceof operator или с помощью метода isPrototypeOf(), который проверяет, является ли прототип объекта в другой цепочке прототипов объекта.
obj instanceof jQuery;
jQuery.prototype.isPrototypeOf(obj);
Но иногда это может быть неудачно в случае нескольких экземпляров jQuery в документе. Как отметил Георгий Иванкин:
Если у меня есть
$
в моем текущем пространстве имен, указывающем наjQuery2
, и у меня есть объект из внешнего пространства имен (где$
isjQuery1
), то у меня нет возможности использовать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));
}
Посмотрим на: Логические операторы и правдивость/ложь
Однако есть еще один способ проверить объект в jQuery.
jQuery.type(a); //this returns type of variable.
Я сделал пример, чтобы понять вещи, ссылка jsfiddle
return el instanceof jQuery ? el.size() > 0 : (el && el.tagName);
nodeType
, а для обеспечения возврата boolean
значения вы можете использовать двойное отрицание !!(el && el.nodeType)
Для тех, кто хочет знать, является ли объект объектом 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"];
}
Вы можете проверить, создан ли объект JQuery, с помощью свойства jquery
:
myObject.jquery // 3.3.1
=> вернуть номер версии JQuery, если объект создан JQuery. => в противном случае возвращает undefined
var elArray = [];
var elObjeto = {};
elArray.constructor == Array //TRUE
elArray.constructor == Object//TALSE
elObjeto.constructor == Array//FALSE
elObjeto.constructor == Object//TRUE
selector
давно устарело и удалено в 3.0. Даже в более ранних версиях объект jQuery может иметь пустую строку селектора, например,$(window)
не имеет селектора. Вместо этого используйтеinstanceof
.