Comment vérifier si un objet anonyme a une méthode?


145

Comment puis-je vérifier si un objet anonyme qui a été créé en tant que tel:

var myObj = { 
    prop1: 'no',
    prop2: function () { return false; }
}

a en effet un prop2 défini?

prop2 sera toujours défini comme une fonction, mais pour certains objets, il n'est pas obligatoire et ne sera pas défini.

J'ai essayé ce qui a été suggéré ici: Comment déterminer si l'objet JavaScript natif a une propriété / méthode? mais je ne pense pas que cela fonctionne pour les objets anonymes.


6
Il n'y a pas beaucoup de différence entre les objets anonymes et non anonymes en JavaScript. Ils sont les mêmes sous le couvercle.
vava le

Réponses:


279

typeof myObj.prop2 === 'function'; vous fera savoir si la fonction est définie.

if(typeof myObj.prop2 === 'function') {
    alert("It's a function");
} else if (typeof myObj.prop2 === 'undefined') {
    alert("It's undefined");
} else {
    alert("It's neither undefined nor a function. It's a " + typeof myObj.prop2);
}

1
essayez ceci si vous voulez vérifier avec la variable dynamiqueif(typeof myObj[propoeryStr] === 'function') { ... }
Vivek

42

Vous voulez hasOwnProperty():

var myObj1 = { 
	prop1: 'no',
	prop2: function () { return false; }
}
var myObj2 = { 
	prop1: 'no'
}

console.log(myObj1.hasOwnProperty('prop2')); // returns true
console.log(myObj2.hasOwnProperty('prop2')); // returns false
	

Références: Mozilla , Microsoft , phrogz.net .


4
cela ne fonctionnera pas si vous avez placé un nœud dom dans un objet créé par vous-même, par exemple si var my_obj = {'node1': document.createElement('div')};then my_obj.node1.hasOwnProperty('cloneNode')est faux. cependant la solution de Sean retournera correctement vrai:typeof my_obj.node1.cloneNode === 'function'
mulllhausen

6
Ne fonctionnera pas si vous recherchez une méthode définie dans le prototype.
Wilt le

2
@Wilt question a spécifié un littéral d'objet anonyme.
artlung

4
@artlung Oui, votre réponse est bonne pour la question, je voulais juste laisser ce commentaire ici pour d'autres qui pourraient rechercher une solution similaire fonctionnant dans d'autres cas (comme moi) ... Je ne voulais pas disqualifier votre réponse.
Wilt

2
Ne gère pas le cas où la propriété est définie, mais n'est pas une fonction.
matt2000

15

3 options

  1. typeof myObj.prop2 === 'function' si le nom de la propriété n'est pas dynamique / généré
  2. myObj.hasOwnProperty('prop2') si le nom de la propriété est dynamique, et ne vérifie que s'il s'agit d'une propriété directe (pas dans la chaîne de prototypes)
  3. 'prop2' in myObj si le nom de la propriété est dynamique, et vérifiez la chaîne de prototypes

8

Qu'entendez-vous par «objet anonyme»? myObjn'est pas anonyme puisque vous avez attribué un littéral d'objet à une variable. Vous pouvez simplement tester ceci:

if (typeof myObj.prop2 === 'function')
{
    // do whatever
}

1

Une façon de le faire doit être if (typeof myObj.prop1 != "undefined") {...}


0

Je sais que c'est une vieille question, mais je suis surpris que toutes les réponses garantissent que la méthode existe et que c'est une fonction, alors que l'OP ne veut que vérifier l'existence. Pour savoir que c'est une fonction (comme beaucoup l'ont dit), vous pouvez utiliser:

typeof myObj.prop2 === 'function'

Mais vous pouvez également utiliser comme condition:

typeof myObj.prop2

Ou même:

myObj.prop2

Il en est ainsi car une fonction évalue trueet undefinedévalue à false. Donc, si vous savez que si le membre existe, il ne peut s'agir que d'une fonction, vous pouvez utiliser:

if(myObj.prop2) {
  <we have prop2>
}

Ou dans une expression:

myObj.prop2 ? <exists computation> : <no prop2 computation>
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.