Лучший способ проверить экземпляр объекта - использовать оператор instanceof или метод isPrototypeOf (), который проверяет, находится ли прототип объекта в цепочке прототипов другого объекта.
obj instanceof jQuery;
jQuery.prototype.isPrototypeOf(obj);
Но иногда это может дать сбой в случае нескольких экземпляров jQuery в документе. Как отметил @ Георгий Иванкин:
если $
в моем текущем пространстве имен указано, jQuery2
и у меня есть объект из внешнего пространства имен (где $
есть jQuery1
), то у меня нет способа использовать instanceof
для проверки, является ли этот объект jQuery
объектом
Одним из способов решения этой проблемы является наложение псевдонима объекта jQuery в замыкании или 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));
}
Давайте посмотрим на: логические операторы и правда / ложь
selector
свойство давно устарело и удалено в 3.0. Даже в более ранних версиях объект jQuery может иметь пустую строку селектора, например,$(window)
не имеет селектора. Используйтеinstanceof
вместо этого.