Существует ли быстрый способ проверки, является ли объект объектом 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')
javascript
jquery
Дэвид Хеллсинг
источник
источник
selector
свойство давно устарело и удалено в 3.0. Даже в более ранних версиях объект jQuery может иметь пустую строку селектора, например,$(window)
не имеет селектора. Используйтеinstanceof
вместо этого.Ответы:
Вы можете использовать
instanceof
оператор:Объяснение :
jQuery
функция (aka$
) реализована как функция-конструктор . Функции конструктора должны вызываться сnew
префиксом.Когда вы звоните
$(foo)
, внутренне jQuery переводит это вnew jQuery(foo)
1 . JavaScript приступает к инициализацииthis
внутри функции конструктора, чтобы указать на новый экземпляр классаjQuery
, установив его свойства в соответствии с теми, которые находятся вjQuery.prototype
(akajQuery.fn
). Таким образом, вы получаетеnew
объект, гдеinstanceof jQuery
находитсяtrue
.1 Это на самом деле
new jQuery.prototype.init(foo)
: логика конструктора была выгружена в другую вызываемую функцию конструктораinit
, но концепция та же самая.источник
if (obj instanceof jQuery){...}
?typeof jQuery === 'function' && obj instanceof jQuery
так какjQuery
не должны быть объявлены в порядке дляtypeof
оператора к работе , не бросать ошибку.Вы также можете использовать свойство .jquery, как описано здесь: http://api.jquery.com/jquery-2/
источник
b instanceof jQuery
выдает ReferenceError, если jQuery не доступен на странице. Оба подхода полезны в разных случаях.try ... catch
, особенно в oldIE.if ((typeof jQuery !== 'undefined') && (obj instanceof jQuery)) {...
a
это будет узел DOM,document.body
и тогда, теоретически, есть вероятность, чтоjquery
ключ каким-то образом окажется поверх цепочки этого узла.Проверьте оператор instanceof .
источник
Лучший способ проверить экземпляр объекта - использовать оператор instanceof или метод isPrototypeOf (), который проверяет, находится ли прототип объекта в цепочке прототипов другого объекта.
Но иногда это может дать сбой в случае нескольких экземпляров jQuery в документе. Как отметил @ Георгий Иванкин:
Одним из способов решения этой проблемы является наложение псевдонима объекта jQuery в замыкании или IIFE.
Другой способ преодолеть эту проблему - запросить
jquery
свойство вobj
Тем не менее, если вы попытаетесь выполнить эту проверку с примитивными значениями, он выдаст ошибку, так что вы можете изменить предыдущую проверку, обеспечивая ,
obj
чтобы бытьObject
Хотя предыдущий способ не самый безопасный (вы можете создать
'jquery'
свойство в объекте), мы можем улучшить проверку, работая с обоими подходами:Проблема здесь состоит в том , что любой объект может определить свойство ,
jquery
как самостоятельно, так лучше было бы спросить в прототипе, и убедитесь , что объект не являетсяnull
илиundefined
Из - за принуждения , то
if
оператор будет сделать короткое замыкание путем оценки&&
оператора , когдаobj
любое из falsy значений (null
,undefined
,false
,0
,""
), а затем переходит к выполнению других проверок.Наконец, мы можем написать служебную функцию:
Давайте посмотрим на: логические операторы и правда / ложь
источник
||
то из этого используете'jquery' in Object(obj)
, то оно будет истощено, потому что это не помешает объектам, не являющимся jQuery, с этим свойством проходить проверку. Я верю, что проверка этого свойства в прототипе улучшает ситуацию. Может быть, вы должны добавить это в свой ответ! Я не думаю, что какой-либо другой ответ здесь упоминаетobj.__proto__.jquery
вместоobj.constructor.prototype.jquery
? немного короче :)constructor.prototype
потому чтоobj
предполагается, что это экземпляр конструктора, то естьjQuery
. С другой стороны__proto__
доступен для любого вида объекта.источник
nodeType
свойство и обеспечитьboolean
возвращаемое значение, вы можете использовать двойное отрицание!!(el && el.nodeType)
Однако есть еще один способ проверить объект в jQuery.
Я сделал пример, чтобы понять вещи, ссылка jsfiddle
источник
Для тех, кто хочет знать, является ли объект объектом jQuery без установленного jQuery, следующий фрагмент должен выполнить эту работу:
источник
Вы можете проверить, создан ли объект JQuery, с помощью
jquery
свойства:=> вернуть номер версии JQuery, если объект создан JQuery. => в противном случае возвращается
undefined
источник
источник