2010-06-13 20 views

Répondre

5
var names = []; 
for(var k in obj) { 
    if(obj.hasOwnProperty(k) && typeof obj[k] == 'function') { 
     names.push(k); 
    } 
} 
+0

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? –

+2

'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]'. –

+0

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? –

3
var functions = []; 
for (var prop in obj) { 
    if ((typeof obj[prop]) == 'function') { 
     // it's a function 
     functions.push(prop); 
    } 
} 
+0

Cela ne fonctionnera pas, sauf si vous utilisez ** minuscules ** "fonction" –

+0

fixe. merci :-) – ob1

3

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.

+0

+1 pour mentionner hasOwnProperty, mais je crois que Jian était après seulement les fonctions, pas toutes les propriétés. –

1

Pour terminer d'autres réponses: vous pouvez également utiliser instanceof:

var obj = { foo: function() { ... }, 
      bar: function() { ... }, 
       ... 
      }, 
    fnArr = []; 

for (var label in obj){ 
    if (obj[label] instanceof Function){ 
    fnArr.push(label) 
    } 
} 
1

Avec ES5:

var obj = { 
    foo: function() {}, 
    bar: function() {}, 
    baz: true 
}; 

function getMethods(object) { 
    return Object.keys(object).filter(function(key) { 
     return typeof object[key] == 'function'; 
    }); 
} 

getMethods(obj); // [foo, bar] 

Object.keys(<object>) retourne les noms de toutes les propriétés énumérables d'un objet comme un tableau, dont la les non-fonctions sont filtrées.

Example - fonctionne sur la version Chrome et les builds nocturnes de Webkit et Tracemonkey (Firefox).