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