2009-02-27 14 views
18

ho pensato che questo sarebbe stato facile come:Come determinare se l'oggetto JavaScript nativo ha una proprietà/metodo?

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! 
} 

E funziona bene in Firefox, ma non in IE, Chrome, Safari, Opera, tornano tutte le proprietà/metodi del nativo Matrice dell'oggetto come 'indefinito' usando questo test.

Il metodo .hasOwnProperty (prop) funziona solo su istanze ... quindi non funziona, ma per tentativi ed errori ho notato che funziona.

//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 
} 

qualcosa che non va con l'utilizzo di questa sintassi per determinare se una proprietà/metodo esiste su un Native Oggetto/~ "Class JavaScript" ~, o c'è un modo migliore per fare questo?

risposta

30

Prima di tutto, typeof è un operatore, non una funzione, quindi non è necessaria la parentesi. In secondo luogo, accedere al prototipo dell'oggetto.

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

Quando si esegue typeof Array.push si sta testando se l'oggetto Array stesso ha un metodo push, non se le istanze di array hanno un metodo push.

+0

Interessante ... Ho letto che .prototype era solo per aggiungere nuove proprietà/metodi agli oggetti, non pensavo di usare typeof su di esso. per esempio. prototipo http://www.devguru.com/technologies/JavaScript/10764.asp typeof http://www.devguru.com/technologies/JavaScript/11529.asp – scunliffe

+0

È per quello, sì, ma non SOLO per quello . Raccomando di guardare la presentazione di Douglas Crockford su "Advanced Javascript" nel Teatro YUI (http://developer.yahoo.com/yui/theater/) - ci sono alcune fantastiche cose "sotto il cofano", incluso il funzionamento dei prototipi degli oggetti. –

+1

questo non vedrà le proprietà definite nei prototipi principali –

2

And it does work fine in Firefox

Questo è solo per coincidenza! In genere, non è possibile che il metodo di un prototipo esista anche sulla funzione di costruzione.

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

Questo era quasi diritto a meno che si dimentica new, un perenne Gotcha JavaScript. new Array().push, o [].push in breve, controllerebbe correttamente un'istanza con il metodo desiderato.

51

Il modo corretto per verificare se una proprietà esiste:

if ('property' in objectVar) 
+1

Stavo cercando un modo per verificare se 'AddFavorite' esiste in window.external, finora questo: alert ('AddFavorite' in window.external) ; è l'unico script che funziona! grazie – Elmer

+1

Questa dovrebbe essere la risposta accettata, funziona in tutti i casi, a differenza della risposta corrente accettata. –

8

Il .hasOwnProperty si può accedere sul proptotype del Array, se typeof non è sufficiente idiomatica.

 

if (Array.prototype.hasOwnProperty('push')) { 
    // Native array has push property 
} 
 
+0

buona opzione: è sufficiente assicurarsi che questo non sia testato sugli elementi DOM nelle versioni precedenti di IE senza prima verificare se l'oggetto ha il metodo '.hasOwnProperty()' http://msdn.microsoft.com/it us/library/328kyd6z% 28VS.85% 29.aspx # CommunityContentHeader – scunliffe