2009-07-31 10 views
3

existe-t-il un moyen d'itérer les propriétés et les méthodes d'un objet. Je dois écrire une fonction d'utilité comme ceci:itération des propriétés d'un objet

function iterate(obj) 
{ 
    //print all obj properties  
    //print all obj methods 
} 

afin d'exécuter cette fonction:

iterate(String); 

imprimera:

property: lenght 
function: charAt 
function: concat... 

des idées?

Répondre

6

Voir ma réponse dans this other question, mais vous ne pouvez pas lire les propriétés intégrées comme ça.

12

doit être aussi simple que cela:

function iterate(obj) { 
    for (p in obj) { 
     console.log(typeof(obj[p]), p); 
    } 
} 

Note: La fonction console.log est en supposant que vous utilisez firebug. À ce stade, les éléments suivants:

obj = { 
    p1: 1, 
    p2: "two", 
    m1: function() {} 
}; 

iterate(obj); 

renverrait:

number p1 
string p2 
function m1 
+0

Il semble que l'exécution de votre exemple fonctionne. Cependant, quand j'ai utilisé la classe String, elle n'a rien retourné. itérer (Chaîne); J'ai également essayé: var s = "sss"; itérer (s); – Amir

+0

Lorsque vous itérez une chaîne, elle parcourt chaque caractère. Essayez de passer String (s) à la place, pour envelopper la chaîne dans un objet. – devios1

0

Vous pouvez utiliser la boucle for pour les propriétés d'un objet.

Voici un exemple simple

var o ={'test':'test', 'blah':'blah'}; 

for(var p in o) 
    alert(p); 
+0

Que faire si la propriété est une clé pour un objet? – Buffalo

3

Cela ne fonctionne que dans les navigateurs modernes (Chrome, Firefox 4+, IE9 +), mais dans ECMAScript 5, vous pouvez obtenir toutes les propriétés d'un objet avec Object.getOwnPropertyNames . Il suffit d'un petit code supplémentaire pour obtenir les propriétés héritées du prototype.

// Put all the properties of an object (including inherited properties) into 
// an object so they can be iterated over 
function getProperties(obj, properties) { 
    properties = properties || {}; 

    // Get the prototype's properties 
    var prototype = Object.getPrototypeOf(obj); 
    if (prototype !== null) { 
     getProperties(prototype, properties); 
    } 

    // Get obj's own properties 
    var names = Object.getOwnPropertyNames(obj); 
    for (var i = 0; i < names.length; i++) { 
     var name = names[i]; 
     properties[name] = obj[name]; 
    } 

    return properties; 
} 

function iterate(obj) { 
    obj = Object(obj); 

    var properties = getProperties(obj); 

    for (var name in properties) { 
     if (typeof properties[name] !== "function") { 
      console.log("property: " + name); 
     } 
    } 
    for (var name in properties) { 
     if (typeof properties[name] === "function") { 
      console.log("function: " + name); 
     } 
    } 
} 
+0

Fonctionne dans les navigateurs les plus récents maintenant: http://kangax.github.com/es5-compat-table/ :) – Spiralis

+0

@Spiralis Merci, j'ai mis à jour ma réponse. –

Questions connexes