Il modo migliore per verificare l'istanza di un oggetto è tramite l' istanza dell'operatore o con il metodo isPrototypeOf () che controlla se il prototipo di un oggetto si trova nella catena di prototipi di un altro oggetto.
obj instanceof jQuery;
jQuery.prototype.isPrototypeOf(obj);
Ma a volte potrebbe fallire nel caso di più istanze jQuery su un documento. Come menzionato da @Georgiy Ivankin:
se ho $
nel mio attuale spazio dei nomi che punta a jQuery2
e ho un oggetto dallo spazio dei nomi esterno (dove si $
trova jQuery1
), allora non ho modo di usare instanceof
per verificare se quell'oggetto è un jQuery
oggetto
Un modo per ovviare a questo problema è alias dell'oggetto jQuery in una chiusura o IIFE
//aliases jQuery as $
(function($, undefined) {
/*... your code */
console.log(obj instanceof $);
console.log($.prototype.isPrototypeOf(obj));
/*... your code */
}(jQuery1));
//imports jQuery1
Un altro modo per ovviare a questo problema è informarsi sulla jquery
proprietàobj
'jquery' in obj
Tuttavia, se si tenta di eseguire tale controllo con valori primitivi, verrà generato un errore, quindi è possibile modificare il controllo precedente assicurandosi obj
di essere unObject
'jquery' in Object(obj)
Sebbene il modo precedente non sia il più sicuro (puoi creare la 'jquery'
proprietà in un oggetto), possiamo migliorare la validazione lavorando con entrambi gli approcci:
if (obj instanceof jQuery || 'jquery' in Object(obj)) { }
Il problema qui è che qualsiasi oggetto può definire una proprietà jquery
come propria, quindi un approccio migliore sarebbe chiedere nel prototipo e assicurarsi che l'oggetto non sia null
oundefined
if (obj && (obj instanceof jQuery || obj.constructor.prototype.jquery)) { }
A causa coercizione , la if
dichiarazione farà cortocircuito valutando l' &&
operatore quando obj
è qualsiasi falsy valori ( null
, undefined
, false
, 0
, ""
), e quindi procede ad eseguire le altre convalide.
Finalmente possiamo scrivere una funzione di utilità:
function isjQuery(obj) {
return (obj && (obj instanceof jQuery || obj.constructor.prototype.jquery));
}
Diamo un'occhiata a: Operatori logici e verità / falsità
selector
proprietà è stata deprecata molto tempo fa e rimossa in 3.0. Anche nelle versioni precedenti, un oggetto jQuery può avere una stringa di selezione vuota, ad esempio$(window)
non ha un selettore. Usainstanceof
invece.