2009-01-28 3 views

Antwort

20

Abhängig von dem Innenleben von jQuery, aber ich würde gehen mit

obj instanceof jQuery 

Es ist das 'JavaScript Weg' es zu tun. Beachten Sie, dass es beim Übergeben von Objekten zwischen Fenster-/Rahmengrenzen fehlschlägt!

Tomalak Vorschlag

'jquery' in obj 

sollte in diesem Fall noch arbeiten, so dass Sie es verwenden sollten, wenn Sie Multi-Fenster-Datenaustausch zu tun erwarten. Ich würde es nicht als allgemeine Lösung empfehlen, da die Suche nach einer Eigenschaft namens 'jquery' nicht sehr zuverlässig ist.

Der Operator in wird ebenfalls einen Fehler ausgeben, wenn obj ein Primitiv ist. Ist dieses Verhalten unerwünscht ist, können Sie stattdessen mit einer dieser Tests prüfen:

obj && obj.jquery 
'jquery' in Object(obj) 

ich die zweite attraktiver finden, aber der erste wird wahrscheinlich schneller sein.

prüfen

Object(obj).hasOwnProperty('jquery') 

wird fehlschlagen, wie jQuery-Objekte nur die Eigenschaft von ihrem Prototyp erben.

ich auch in JavaScript für die Typprüfung mit der constructor Eigenschaft entmutigen würde - es könnte zuverlässig für jQuery arbeiten, aber als constructor ist nur eine Eigenschaft des Objekts zu prototype Eigenschaft zum Zeitpunkt der Instanzierung des durch die Konstruktorfunktion zeigte, gibt es viele Möglichkeiten zu Chaos mit solchen Tests ...


Als Randbemerkung:

jQuery selbst prüft, ob obj && obj.jquery. Es verwendet instanceof nicht einmal. Stattdessen wird eine Kombination aus typeof, Duck-Typisierung und toString.call() für die Typprüfung verwendet, die funktionieren sollte, wenn instanceof fehlschlägt.

Auch hasOwnProperty() wird nie auch verwendet. Ich bin mir nicht sicher, was das über die Codequalität der jQuery-Bibliothek sagt;)

+1

Viel detaillierter als meine Post: +1 und ich empfehle Ihren Beitrag als Antwort gewählt werden – VonC

+0

Sie haben meine Stimme für die Erwähnung des Scheiterns von instanceof über Fenster/Frame Grenzen! –

+0

Also welches ist das Beste? – Kato

6

Einer der folgenden:

obj instanceof jQuery 
obj && obj.constructor == jQuery 
obj && obj.jquery 

Instanceof is recommended

+0

was ist mit: "jquery" in obj? – Tomalak

+0

Ich würde empfehlen, instanceof selbst zu verwenden, da es [bekannte Speicherlecks] (http://ajaxian.com/archives/working-aroung-the-instanceof-memory-leak) gibt, wenn instanceof in IE verwendet wird. – kflorence

0

Verwenden Sie dies anstelle von instanceof, um auf jQuery-Objekte zu testen.

/** 
* @see http://ajaxian.com/archives/working-aroung-the-instanceof-memory-leak 
* @return Boolean True if object is of type jQuery, false otherwise 
*/ 
function isjQuery(obj) { 
    return obj && obj.hasOwnProperty && obj instanceof jQuery; 
} 
+0

Warum sollte man das anstelle von instanceof verwenden? – Kato

+0

Bitte lesen Sie den Link im Kommentar. – kflorence