Edit: J'ai mal lu un peu la question, vous voulez extraire les noms des seulement les propriétés qui sont des objets de fonction:
function methods(obj) {
var result = [];
for (var prop in obj) {
if (obj.hasOwnProperty(prop) && typeof obj[prop] == 'function') {
result.push(prop);
}
}
return result;
}
var obj = {
foo: function() { },
bar: function() { },
};
methods(obj); // ["foo", "bar"]
J'utilise la méthode hasOwnProperty
, pour s'assurer que les propriétés énumérées existent réellement physiquement dans l'objet.
Notez que cette approche et toutes les autres réponses ont un petit problème IE.
Les JScript's DontEnum Bug, les propriétés personnalisées qui assombrissent les propriétés non-dénombrables (DontEnum
) plus dans la chaîne de prototype, ne sont pas dénombrés à l'aide de la for-in, par exemple:
var foo = {
constructor : function() { return 0; },
toString : function() { return "1"; },
valueOf : function() { return 2; }
toLocaleString : function() { return "3"; }
};
for (var propName in foo) { alert(propName); }
L'objet foo
a clairement défini quatre propriétés propres, mais ces propriétés existent dans Object.prototype
marqué DontEnum
, si vous essayez d'énumérer les propriétés de cet objet avec l'instruction for-in
dans IE, il n'en trouvera pas.
Ce bogue est présent sur toutes les versions d'IE et a été récemment corrigé dans IE9 Platform Preview.
intéressant, comment se fait-il que push n'introduise pas de référence de fonction dans le tableau mais pousse le nom de la fonction? –
'pour les boucles in' sur les noms de propriété, pas les propriétés réelles. Donc, si vous voulez référencer chaque propriété, vous utiliserez 'obj [k]'. –
alors que s'il n'y a qu'une seule fonction à l'intérieur, encore besoin d'utiliser une boucle "for in" pour atteindre cet objectif? Y a-t-il un autre moyen si la boucle "for in" n'existe pas? –