Der beste Weg, die Instanz eines Objekts zu überprüfen, ist durch instanceof Betreiber oder mit der Methode isPrototypeOf() die prüft, ob der Prototyp eines Objekts in der Prototypenkette eines anderen Objekts enthalten ist.
obj instanceof jQuery;
jQuery.prototype.isPrototypeOf(obj);
Aber manchmal kann es bei mehreren jQuery-Instanzen in einem Dokument fehlschlagen. Wie @Georgiy Ivankin erwähnte:
wenn ich $
in meinem aktuellen Namespace, die auf jQuery2
und ich habe ein Objekt aus dem äußeren Namespace (wo $
es jQuery1
), dann habe ich keine Möglichkeit, die instanceof
um zu prüfen, ob das Objekt ein jQuery
Objekt
Eine Möglichkeit, dieses Problem zu überwinden, ist das Aliasing des jQuery-Objekts in einer Verschluss o IIFE
//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 überwinden, ist die Anfrage an die jquery
Eigentum in obj
'jquery' in obj
Wenn Sie jedoch versuchen, diese Prüfung mit primitiven Werten durchzuführen, wird ein Fehler ausgelöst, so dass Sie die vorherige Prüfung ändern können, indem Sie sicherstellen, dass obj
zu sein Object
'jquery' in Object(obj)
Obwohl der vorherige Weg nicht der sicherste ist (Sie können die 'jquery'
Eigenschaft in einem Objekt), können wir die Validierung verbessern, indem wir mit beiden Ansätzen arbeiten:
if (obj instanceof jQuery || 'jquery' in Object(obj)) { }
Das Problem dabei ist, dass jedes Objekt eine Eigenschaft definieren kann jquery
als eigene, so dass ein besserer Ansatz wäre, im Prototyp zu fragen und sicherzustellen, dass das Objekt nicht null
o undefined
if (obj && (obj instanceof jQuery || obj.constructor.prototype.jquery)) { }
Aufgrund von Nötigung El if
Anweisung einen Kurzschluss durch Auswertung der &&
Betreiber, wenn obj
ist eine der falsy Werte ( null
, undefined
, false
, 0
, ""
), und führt dann die anderen Validierungen durch.
Schließlich können wir eine Nutzenfunktion schreiben:
function isjQuery(obj) {
return (obj && (obj instanceof jQuery || obj.constructor.prototype.jquery));
}
Schauen wir uns das mal an: Logische Operatoren und wahr/falsch
3 Stimmen
Ab jQuery 3.0 ist dies definitiv kein korrekter Weg, um zu prüfen, ob ein Objekt ein jQuery-Objekt ist, da die
selector
wurde vor langer Zeit veraltet und in Version 3.0 entfernt. Auch in früheren Versionen kann ein jQuery-Objekt einen leeren Selektorstring haben, zum Beispiel$(window)
hat keinen Selektor. Verwenden Sieinstanceof
stattdessen.