Какой правильный/правильный способ проверить, является ли объект объектом jQuery в javascript?

Я пишу функцию javascript и в "компактном" дизайне javascript, тип/длина аргументов изменяет поведение функции. Одним из возможных типов аргументов является объект jQuery, для которого мне нужна очень специальная логика.

Каков наилучший способ проверить, является ли объект экземпляром jQuery?

Ответ 1

Зависит от внутренней работы jQuery, но я бы пошел с

obj instanceof jQuery

Это самый "способ JavaScript" для этого. Имейте в виду, что при передаче объектов между границами окна и кадра он будет терпеть неудачу!

Предложение Томалака

'jquery' in obj

должен по-прежнему работать в этом случае, поэтому вы должны использовать его, если вы планируете использовать многооконный обмен данными. Я бы не рекомендовал его в качестве общего решения, так как просто поиск свойства с именем 'jquery' не очень надежный.

Оператор in также выдает ошибку, если obj является примитивным. Если это поведение нежелательно, вы можете вместо этого использовать один из этих тестов:

obj && obj.jquery
'jquery' in Object(obj)

Я считаю, что вторая привлекательна, но первая, скорее всего, будет быстрее.

Проверка

Object(obj).hasOwnProperty('jquery')

не удастся, так как объекты jQuery наследуют свойство только от своего прототипа.

Я также отказался бы использовать свойство constructor для проверки типов в JavaScript - он мог бы надежно работать для jQuery, но поскольку constructor является просто свойством объекта, на который указывает функция конструктора prototype свойство at время создания экземпляра, есть много способов возиться с такими тестами...


В качестве примечания:

jQuery сам проверяет obj && obj.jquery. Он не использует instanceof даже один раз. Вместо этого он использует комбинацию typeof, duck-typing и toString.call() для проверки типов, которая должна работать там, где instanceof не работает.

Кроме того, hasOwnProperty() никогда не используется. Я не уверен, что это говорит о качестве кода в библиотеке jQuery;)

Ответ 2

Одно из следующего:

obj instanceof jQuery
obj && obj.constructor == jQuery
obj && obj.jquery 

instanceof рекомендуется

Ответ 3

Используйте это вместо instanceof для проверки объектов jQuery.

/**
 * @see http://ajaxian.com/archives/working-aroung-the-instanceof-memory-leak
 * @return Boolean True if object is of type jQuery, false otherwise
 */
function isjQuery(obj) {
    return obj && obj.hasOwnProperty && obj instanceof jQuery;
}