Der beste Weg , um die Instanz eines Objekts zu überprüfen ist , durch Instanceof Bediener oder mit dem Verfahren isPrototypeOf () , die , wenn der Prototyp eines Objekts prüft in einem anderen Prototypkette des Objekts.
obj instanceof jQuery;
jQuery.prototype.isPrototypeOf(obj);
Manchmal kann dies jedoch bei mehreren jQuery-Instanzen in einem Dokument fehlschlagen. Wie @Georgiy Ivankin erwähnte:
Wenn ich $
in meinem aktuellen Namespace auf zeige jQuery2
und ein Objekt aus dem äußeren Namespace (wo $
ist jQuery1
) habe, kann ich nicht instanceof
überprüfen, ob es sich bei diesem Objekt um ein jQuery
Objekt handelt
Eine Möglichkeit, dieses Problem zu beheben, besteht darin, das jQuery-Objekt in einem Closure oder IIFE zu aliasen
//aliases jQuery as $
(function($, undefined) {
/*... your code */
console.log(obj instanceof $);
console.log($.prototype.isPrototypeOf(obj));
/*... your code */
}(jQuery1));
//imports jQuery1
Eine andere Möglichkeit, dieses Problem zu lösen, besteht darin, die jquery
Immobilie in zu erkundigenobj
'jquery' in obj
Wenn Sie jedoch versuchen, diese Prüfung mit primitiven Werten durchzuführen, wird ein Fehler ausgegeben, sodass Sie die vorherige Prüfung ändern können, indem Sie sicherstellen obj
, dass es sich um eine handeltObject
'jquery' in Object(obj)
Obwohl der vorherige Weg nicht der sicherste ist (Sie können die 'jquery'
Eigenschaft in einem Objekt erstellen ), können wir die Validierung verbessern, indem wir mit beiden Ansätzen arbeiten:
if (obj instanceof jQuery || 'jquery' in Object(obj)) { }
Das Problem hierbei ist, dass jedes Objekt eine Eigenschaft jquery
als eigene definieren kann. Ein besserer Ansatz wäre es, im Prototyp nachzufragen und sicherzustellen, dass das Objekt nicht null
oder istundefined
if (obj && (obj instanceof jQuery || obj.constructor.prototype.jquery)) { }
Durch Zwang , die if
wird Anweisung durch die Auswertung der Kurzschluss machen &&
Bediener , wenn obj
eine der ist falsy Werte ( null
, undefined
, false
, 0
, ""
), und dann geht die anderen Validierungen durchzuführen.
Endlich können wir eine Utility-Funktion schreiben:
function isjQuery(obj) {
return (obj && (obj instanceof jQuery || obj.constructor.prototype.jquery));
}
Werfen wir einen Blick auf: Logische Operatoren und Wahrheit / Falschheit
selector
Eigenschaft vor langer Zeit veraltet und in 3.0 entfernt wurde. Selbst in früheren Versionen kann ein jQuery-Objekt eine leere Selektorzeichenfolge haben, z. B.$(window)
keinen Selektor. Verwenden Sieinstanceof
stattdessen.