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 jQuery2e ho un oggetto dallo spazio dei nomi esterno (dove si $trova jQuery1), allora non ho modo di usare instanceofper verificare se quell'oggetto è un jQueryoggetto
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 jqueryproprietà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 objdi 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à jquerycome propria, quindi un approccio migliore sarebbe chiedere nel prototipo e assicurarsi che l'oggetto non sia nulloundefined
if (obj && (obj instanceof jQuery || obj.constructor.prototype.jquery)) { }
A causa coercizione , la ifdichiarazione 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à
selectorproprietà è 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. Usainstanceofinvece.