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