Подтвердить что ты не робот

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

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

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

4b9b3361

Ответ 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;
}