2009-02-27 5 views
18

Ich dachte, das so einfach wäre wie:Wie kann festgestellt werden, ob das native JavaScript-Objekt eine Eigenschaft/Methode hat?

if(typeof(Array.push) == 'undefined'){ 
    //not defined, prototype a version of the push method 
    // Firefox never gets here, but IE/Safari/Chrome/etc. do, even though 
    // the Array object has a push method! 
} 

Und es in Firefox fein funktioniert, aber nicht in IE, Chrome, Safari, Opera, kehren sie alle Eigenschaften/Methoden des nativen Array-Objekt als "undefiniert" mit diesem Test.

Die .hasOwnProperty (prop) -Methode funktioniert nur auf Instanzen ... so funktioniert es nicht, aber durch Versuch und Irrtum habe ich festgestellt, dass dies funktioniert.

//this works in Firefox/IE(6,7,8)/Chrome/Safari/Opera 
if(typeof(Array().push) == 'undefined'){ 
    //not defined, prototype a version of the push method 
} 

Gibt es etwas falsch mit dieser Syntax auf eine india Object/~ „JavaScript Klasse“ ~, wenn eine Eigenschaft/Methode existiert, um zu bestimmen verwenden oder gibt es einen besseren Weg, dies zu tun?

Antwort

30

Zunächst ist typeof ein Operator, keine Funktion, Sie brauchen also keine Klammern. Zweitens, greifen Sie auf den Prototyp des Objekts zu.

alert(typeof Array.prototype.push); 
alert(typeof Array.prototype.foo); 

Wenn Sie typeof Array.push ausführen Sie testen, wenn das Array-Objekt selbst eine Push-Methode hat, nicht, wenn Instanzen von Array ein Push-Verfahren haben.

+0

Interessant ... Ich habe gelesen, dass .prototype nur zum Hinzufügen neuer Eigenschaften/Methoden zu Objekten gedacht war, ich dachte nicht, typeof darauf zu verwenden. z.B. Prototyp http://www.devguru.com/technologies/JavaScript/10764.asp typeof http://www.devguru.com/technologies/JavaScript/11529.asp – scunliffe

+0

Es ist für das, ja, aber nicht nur dafür . Ich empfehle Douglas Crockfords Präsentation über "Advanced Javascript" im YUI Theatre (http://developer.yahoo.com/yui/theater/) - dort gibt es einige großartige "unter der Haube" Zeug, einschließlich der Funktionsweise von Prototypen. –

+1

Dies wird nicht die Eigenschaften in übergeordneten Prototypen –

2

And it does work fine in Firefox

Das ist nur Zufall! Sie können im Allgemeinen nicht erwarten, dass die Methode eines Prototyps auch in der Konstruktorfunktion vorhanden ist.

if(typeof(Array().push) == 'undefined') 

Das war fast richtig, außer Sie new, einen ausdauernden JavaScript Gotcha vergessen. new Array().push, oder [].push kurz, würde korrekt prüfen, ob eine Instanz die von Ihnen gewünschte Methode hat.

51

Der richtige Weg, um zu überprüfen, ob eine Eigenschaft existiert:

if ('property' in objectVar) 
+1

Ich war auf der Suche nach einer Möglichkeit zu überprüfen, ob 'AddFavorite' existiert in window.external, so weit dies: alert ('AddFavorite' in window.external) ; ist das einzige Skript, das funktioniert! danke – Elmer

+1

Dies sollte die akzeptierte Antwort sein, es funktioniert in allen Fällen, im Gegensatz zu der derzeit akzeptierten Antwort. –

8

Die .hasOwnProperty auf dem Array proptotype zugegriffen werden kann, wenn typeof genug nicht idiomatischen ist.

+0

gute Option - nur sicherstellen, dass dies nicht auf DOM-Elemente in älteren Versionen von IE getestet wird, ohne zuerst zu prüfen, ob das Objekt die '.hasOwnProperty()' Methode hat http://msdn.microsoft.com/en- us/bibliothek/328kyd6z% 28VS.85% 29.aspx # CommunityContentHeader – scunliffe

Verwandte Themen