Comment déterminer si objet natif JavaScript possède une propriété / méthode?

voix
18

Je pensais que ce serait aussi facile que:

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

Et il ne fonctionnent très bien dans Firefox, mais pas dans IE, Chrome, Safari, Opera , ils retournent toutes les propriétés / méthodes du natif objet Array comme « non défini » en utilisant ce test.

La méthode .hasOwnProperty (prop) ne fonctionne que sur les instances ... il ne fonctionne pas, mais par tâtonnement j'ai remarqué que cela fonctionne.

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

Y at - il de mal à utiliser cette syntaxe pour déterminer si une propriété / méthode existe sur un objet / ~ « classe JavaScript » ~ autochtone , ou est - il une meilleure façon de le faire?

Créé 27/02/2009 à 18:33
source utilisateur
Dans d'autres langues...                            


4 réponses

voix
30

Tout d'abord, typeof est un opérateur, pas une fonction, de sorte que vous n'avez pas besoin des parenthèses. En second lieu, accéder au prototype de l'objet.

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

Lorsque vous exécutez typeof Array.pushvous testez si l'objet tableau lui - même a une méthode push, pas si les instances de tableau ont une méthode de poussée.

Créé 27/02/2009 à 18:41
source utilisateur

voix
2

Et il fait bien de travail dans Firefox

C'est seulement par hasard! Vous ne pouvez pas attendre généralement la méthode d'un prototype existe également sur la fonction constructeur.

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

Ce fut à peu près droit que vous oubliez new, une Gotcha pérenne JavaScript. new Array().pushOu [].pushpour faire court, serait bien vérifier une instance avait la méthode que vous vouliez.

Créé 27/02/2009 à 18:54
source utilisateur

voix
51

La bonne façon de vérifier si une propriété existe:

if ('property' in objectVar)
Créé 21/03/2010 à 21:00
source utilisateur

voix
8

Le .hasOwnPropertypeut être consulté sur le proptotype du tableau, si typeofne suffit pas idiomatiques.


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

Créé 19/04/2010 à 23:14
source utilisateur

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more