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
Répondre
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>
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]); } }
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. –
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.
Non, vous ne pouvez pas lister les propriétés intégrées de l'objet. Mais vous pouvez vous référer à la référence de l'implémenteur. Par exemple, pour connaître toutes les méthodes et propriétés de l'objet Math implémenté sur Firefox, vous allez utiliser Javascript Math Référence Firefox: https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Math
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"]
Pour clarifier un peu, Object.getOwnPropertyNames (Array) fournit les propriétés intégrées à Array. – forforf
Pourriez-vous stringify votre objet à JSON et analyser le résultat? – starbeamrainbowlabs