Vous pouvez utiliser Object.getOwnPropertyNames()
pour obtenir toutes les propriétés qui appartiennent à un objet, qu'elles soient énumérables ou non. Par exemple:
console.log(Object.getOwnPropertyNames(Math));
//-> ["E", "LN10", "LN2", "LOG2E", "LOG10E", "PI", ...etc ]
Vous pouvez ensuite utiliser filter()
pour obtenir uniquement les méthodes:
console.log(Object.getOwnPropertyNames(Math).filter(function (p) {
return typeof Math[p] === 'function';
}));
//-> ["random", "abs", "acos", "asin", "atan", "ceil", "cos", "exp", ...etc ]
Dans les navigateurs ES3 (IE 8 et versions antérieures), les propriétés des objets intégrés ne sont pas énumérables. Les objets aiment window
et document
ne sont pas intégrés, ils sont définis par le navigateur et très probablement énumérables par conception.
De l' ECMA-262 Edition 3 :
Objet global
Il existe un objet global unique (15.1), qui est créé avant que le contrôle n'entre dans un contexte d'exécution. Initialement, l'objet global a les propriétés suivantes:
• Objets intégrés tels que Math, String, Date, parseInt, etc. Ceux-ci ont des attributs {DontEnum} .
• Propriétés supplémentaires définies par l'hôte. Cela peut inclure une propriété dont la valeur est l'objet global lui-même; par exemple, dans le modèle d'objet de document HTML, la propriété window de l'objet global est l'objet global lui-même.
Lorsque le contrôle entre dans des contextes d'exécution et que le code ECMAScript est exécuté, des propriétés supplémentaires peuvent être ajoutées à l'objet global et les propriétés initiales peuvent être modifiées.
Je dois souligner que cela signifie que ces objets ne sont pas des propriétés énumérables de l'objet Global. Si vous parcourez le reste du document de spécification, vous verrez que la plupart des propriétés et méthodes intégrées de ces objets ont l' { DontEnum }
attribut défini.
Mise à jour: un autre utilisateur SO, CMS, a attiré mon attention sur{ DontEnum }
un bug IE .
Au lieu de vérifier l'attribut DontEnum, [Microsoft] JScript sautera toute propriété dans tout objet où il existe une propriété du même nom dans la chaîne de prototype de l'objet qui a l'attribut DontEnum.
En bref, méfiez-vous lorsque vous nommez les propriétés de votre objet. S'il existe une propriété ou une méthode de prototype intégrée du même nom, IE l'ignorera lors de l'utilisation d'une for...in
boucle.