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 jQuery2e eu tenho um objeto do namespace externo (onde $está jQuery1), não tenho como usar instanceofpara verificar se esse objeto é um jQueryobjeto
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 jquerypropriedade 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 objumaObject
'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 jquerycomo própria, portanto, uma abordagem melhor seria perguntar no protótipo e garantir que o objeto não seja nullou nãoundefined
if (obj && (obj instanceof jQuery || obj.constructor.prototype.jquery)) { }
Devido à coerção , a ifdeclaração entrará em curto-circuito avaliando o &&operador quando objalguma 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
selectorpropriedade 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 eminstanceofvez disso.