163 votes

Comment vérifier si un objet anonyme possède une méthode ?

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

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

a bien une prop2 définie ?

prop2 sera toujours définie comme une fonction, mais pour certains objets, elle n'est pas nécessaire et ne sera pas définie.

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

7 votes

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

307voto

Sean Vieira Points 47080

typeof myObj.prop2 === 'function'; vous permettra de 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);
}

2 votes

Essayez ceci si vous voulez vérifier avec une variable dynamique if(typeof myObj[propoeryStr] === 'function') { ... }

46voto

artlung Points 13433

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 votes

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')}; puis my_obj.node1.hasOwnProperty('cloneNode') est faux. Cependant, la solution de Sean retournera correctement vrai : typeof my_obj.node1.cloneNode === 'function'

8 votes

Cela ne fonctionnera pas si vous recherchez une méthode qui a été définie dans le prototype.

2 votes

La question de @Wilt a spécifié un objet littéral anonyme.

22voto

Peter Tseng Points 3272

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 vérifier seulement s'il s'agit d'une propriété directe (pas en aval de la chaîne de prototypes)
  3. 'prop2' in myObj si le nom de la propriété est dynamique, et vérifier en bas de la chaîne des prototypes

8voto

Matt Ball Points 165937

Que voulez-vous dire par "objet anonyme" ? myObj n'est pas anonyme puisque vous avez assigné un objet littéral à une variable. Vous pouvez simplement tester cela :

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

3voto

Javier Elices Points 1180

Je sais que c'est une vieille question, mais je suis surpris que toutes les réponses assurent que la méthode existe et c'est une fonction, quand le PO veut seulement 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 aussi l'utiliser comme condition :

typeof myObj.prop2

Ou même :

myObj.prop2

Il en est ainsi parce qu'une fonction évalue à true y undefined évalue à false . Ainsi, 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>

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X