A melhor maneira de verificar a instância de um objeto é através do instanceof operator ou com o método isPrototypeOf (), que inspeciona se o protótipo de um objeto está na cadeia de protótipos de outro objeto.
obj instanceof jQuery;
jQuery.prototype.isPrototypeOf(obj);
Mas, às vezes, pode falhar no caso de várias instâncias do jQuery em um documento. Como @Georgiy Ivankin mencionou:
se eu tenho $
no meu namespace atual apontando para jQuery2
e eu tenho um objeto do namespace externo (onde $
está jQuery1
), não tenho como usar instanceof
para verificar se esse objeto é um jQuery
objeto
Uma maneira de superar esse problema é aliasing do objeto jQuery em um fechamento ou IIFE
//aliases jQuery as $
(function($, undefined) {
/*... your code */
console.log(obj instanceof $);
console.log($.prototype.isPrototypeOf(obj));
/*... your code */
}(jQuery1));
//imports jQuery1
Outra maneira de superar esse problema é consultando a jquery
propriedade emobj
'jquery' in obj
No entanto, se você tentar executar essa verificação com valores primitivos, ocorrerá um erro, para que você possa modificar a verificação anterior, garantindo obj
umaObject
'jquery' in Object(obj)
Embora a maneira anterior não seja a mais segura (você pode criar a 'jquery'
propriedade em um objeto), podemos melhorar a validação trabalhando com as duas abordagens:
if (obj instanceof jQuery || 'jquery' in Object(obj)) { }
O problema aqui é que qualquer objeto pode definir uma propriedade jquery
como própria, portanto, uma abordagem melhor seria perguntar no protótipo e garantir que o objeto não seja null
ou nãoundefined
if (obj && (obj instanceof jQuery || obj.constructor.prototype.jquery)) { }
Devido à coerção , a if
declaração entrará em curto-circuito avaliando o &&
operador quando obj
alguma das Falsas valores (null
,undefined
,false
,0
,""
), e então começa a executar as outras validações.
Finalmente, podemos escrever uma função utilitária:
function isjQuery(obj) {
return (obj && (obj instanceof jQuery || obj.constructor.prototype.jquery));
}
Vamos dar uma olhada em: Operadores lógicos e verdade / falsidade
selector
propriedade foi descontinuada há muito tempo e removida no 3.0. Mesmo nas versões anteriores, um objeto jQuery pode ter uma cadeia de seletores vazia, por exemplo$(window)
, não possui seletor. Use eminstanceof
vez disso.