2008-11-04 7 views
6

Y a-t-il un moyen de faire une boucle sur les propriétés intégrées d'un objet Javascript? Je me rapproche de l'endroit où je veux aller, mais "A for ... in loop ne fait pas de itérations sur les propriétés intégrées."Liste des propriétés intégrées de l'objet

+0

Pourriez-vous stringify votre objet à JSON et analyser le résultat? – starbeamrainbowlabs

Répondre

-1

Cela fonctionnera avec JSON. Il n'a pas été testé beaucoup:

<style> 
.tree { 
    margin-left:5px; 
} 
</style> 
<div id='out'></div> 
<script type="text/javascript"> 
data = {"feep":{"bar":{"baz":"37628","quux":{"a":"179","b":"7"}},"foo":"1025"},"Bleh":"1234"} 
$('out').innerHTML = renderJSON(data) 

function renderJSON(obj) { 
    var keys = [] 
    var retValue = "" 
    for (var key in obj) { 
     //$('out').innerHTML = $('out').innerHTML +"<br />" + key + ", " + obj[key]  
     if(typeof obj[key] == 'object') { 
      retValue += "<div class='tree'>" + key      
      retValue += renderJSON(obj[key]) 
      retValue += "</div>" 
     } 
     else { 
      retValue += "<div class='tree'>" + key + " = " + obj[key] + "</div>" 
     } 

     keys.push(key) 
    } 
    return retValue 

} 
</script> 
0

Quand vous dites « construit dans les propriétés », qui ensemble de propriétés vous parlez exactement?

De Douglas Crockford de 'JavaScript - The Good Parts':

dans la déclaration peut boucler sur tous des noms de propriété dans un objet. L'énumération comprendra tous les propriétés, y compris les fonctions et les propriétés prototype que vous pourriez ne pas être intéressé en sorte qu'il est nécessaire pour filtrer les valeurs que vous ne voulez pas . Les filtres les plus courants sont la méthode hasOwnProperty et utilisant typeof pour exclure les fonctions:

var name; 
for (name in another_stooge) 
{ 
    if (typeof another_stooge[name] !== 'function') { 
     document.writeln(name + ': ' + another_stooge[name]); 
    } 
} 
+0

Mon cas d'utilisation particulier énumère les méthodes intégrées pour Array.prototype. De la référence javascript core de MDC: "A for ... in loop ne parcourt pas les propriétés intégrées." Ce qu'une simple boucle sur Array.prototype confirme. –

5

La réponse est non. Vous ne pouvez pas énumérer les propriétés qui ne sont pas énumérables. Il y a cependant au moins deux façons de contourner cela. La première consiste à générer toutes les combinaisons possibles de caractères à utiliser comme noms de propriétés de test (pensez: a, b, c, ... aa, ab, ac, ad, ...). Étant donné que la communauté des standards est connue pour avoir proposé des noms de méthodes très longs (getElementsByTagNames, propertyIsEnumerable), cette méthode demandera de la patience. :-)

Une autre approche consiste à tester les propriétés natives connues à partir d'une liste prédéfinie.

Par exemple: Pour un array vous tester pour toutes les propriétés indigènes connues de Function.prototype:

prototype caller constructor length name apply call toSource toString valueOf toLocaleString 

... et les choses héritées de Object.prototype:

__defineGetter__ __defineSetter__ hasOwnProperty isPrototypeOf __lookupGetter__ 
__lookupSetter__ __noSuchMethod__ propertyIsEnumerable unwatch watch 

... et les choses héritées à partir de Array:

index input pop push reverse shift sort splice unshift concat join slice indexOf lastIndexOf 
filter forEach every map some reduce reduceRight 

..et enfin, et le cas échéant, chaque propriété dénombrable de l'objet que vous testez:

for (var property in myArrayObject) myPossibleProperties.push(property); 

Vous serez alors en mesure de tester chacun de ceux pour voir si elles sont présentes sur l'instance d'objet.

Ceci ne révèlera pas les membres inconnus non énumérables (non documentés, ou définis par d'autres scripts), mais vous permettra de lister les propriétés natives disponibles. J'ai trouvé l'information sur les propriétés natives Array sur Mozilla Developer Center et MSDN.

17

Je me rends compte de cette question est de trois ans, mais maintenant, avec ES5, il est possible :

>>> Object.getOwnPropertyNames(Object)

["prototype", "getPrototypeOf", "getOwnPropertyDescriptor", "keys", "defineProperty", "defineProperties", "create", "getOwnPropertyNames", "isExtensible", "preventExtensions", "freeze", "isFrozen", "seal", "isSealed", "length", "arity", "name", "arguments", "caller"]

+3

Pour clarifier un peu, Object.getOwnPropertyNames (Array) fournit les propriétés intégrées à Array. – forforf

Questions connexes