La méthode Object.getOwnPropertyNames()
renvoie un tableau de toutes les propriétés (énumérables ou non) propres à un objet (c'est-à-dire n'étant pas héritées via la chaîne de prototypes).
Syntaxe
Object.getOwnPropertyNames(obj)
Paramètres
obj
- L'objet dont seront listées les propriétés propres énumérables et non-énumérables.
Valeur de retour
Un tableau de chaînes de caractères qui sont les noms des propriétés propres (celles directement rattachées à l'objet) de l'objet passé en argument.
Description
Object.getOwnPropertyNames
renvoie un tableau dont les éléments sont des chaînes de caractères correspondant aux noms des propriétés énumerables et non-énumerables appartenant directement à l'objet obj
. L'ordre des propriétés énumérables est cohérent avec l'ordre utilisé dans une boucle for...in
(ou avec Object.keys
) parmi les propriétés de l'objet. L'ordre des propriétés non-énumérables dans le tableau et parmi les propriétés énumérables n'est pas défini.
Exemples
Utiliser Object.getOwnPropertyNames()
var arr = ["a", "b", "c"]; console.log(Object.getOwnPropertyNames(arr).sort()); // ["0", "1", "2", "length"] // Objet semblable à un tableau (array-like) var obj = { 0: "a", 1: "b", 2: "c"}; console.log(Object.getOwnPropertyNames(obj).sort()); // ["0", "1", "2"] // On affiche les noms et les valeurs // des propriétés avec Array.forEach Object.getOwnPropertyNames(obj).forEach(function(val, idx, array) { console.log(val + " -> " + obj[val]); }); // affiche // 0 -> a // 1 -> b // 2 -> c // propriété non-énumérable var mon_obj = Object.create({}, { getToto: { value: function() { return this.toto; }, enumerable: false } }); mon_obj.toto = 1; console.log(Object.getOwnPropertyNames(mon_obj).sort()); // ["toto", "getToto"]
Si on souhaite n'avoir que les propriétés énumérables, on peut utiliser Object.keys
ou bien une boucle for...in
(ces méthodes renverront également les propriétés héritées via la chaîne de prototypes si on ne filtre pas avec la méthode hasOwnProperty()
).
Les propriétés héritées via la chaîne de prototype ne sont pas listées :
function ClasseParente() {} ClasseParente.prototype.inheritedMethod = function () {}; function ClasseFille () { this.prop = 5; this.method = function () {}; } ClasseFille.prototype = new ClasseParente(); ClasseFille.prototype.prototypeMethod = function () {}; console.log( Object.getOwnPropertyNames( new ClasseFille() // ["prop", "method"] ) )
Obtenir uniquement les propriétés non-énumérables
On utilise ici la fonction Array.prototype.filter()
pour retirer les clés énumérables (obtenus avec Object.keys()
) de la liste de toutes les clés (obtenues avec Object.getOwnPropertynames
) afin de n'avoir que les propriétés propres non-énumérables.
var target = myObject; var enum_et_nonenum = Object.getOwnPropertyNames(target); var enum_uniquement = Object.keys(target); var nonenum_uniquement = enum_et_nonenum.filter(function(key) { var indexInEnum = enum_uniquement.indexOf(key) if (indexInEnum == -1) { // non trouvée dans enum_uniquement indique // que la clé est non-énumérable, on la // garde donc dans le filtre avec true return true; } else { return false; } }); console.log(nonenum_uniquement);
Notes
Pour ES5, si l'argument passé à la méthode n'est pas un objet (mais une valeur d'un autre type primitif), une exception TypeError
sera levée. Pour ES6, un argument qui n'est pas un objet sera d'abord transformé en objet avant que la méthode soit appliquée.
Object.getOwnPropertyNames('toto') TypeError: "toto" n'est pas un objet // code ES5 Object.getOwnPropertyNames('toto') ['length', '0', '1', '2'] // code ES6
Spécifications
Spécification | État | Commentaires |
---|---|---|
ECMAScript 5.1 (ECMA-262) La définition de 'Object.getOwnPropertyNames' dans cette spécification. |
Standard | Définition initiale. Implémentée avec JavaScript 1.8.5 |
ECMAScript 2015 (6th Edition, ECMA-262) La définition de 'Object.getOwnPropertyNames' dans cette spécification. |
Standard | |
ECMAScript 2017 Draft (ECMA-262) La définition de 'Object.getOwnPropertyNames' dans cette spécification. |
Projet |
Compatibilité des navigateurs
Fonctionnalité | Chrome | Firefox (Gecko) | Internet Explorer | Opera | Safari |
---|---|---|---|---|---|
Support simple | 5 | 4.0 (2) | 9 | 12 | 5 |
Fonctionnalité | Android | Chrome pour Android | Firefox Mobile (Gecko) | IE Mobile | Opera Mobile | Safari Mobile |
---|---|---|---|---|---|---|
Support simple | ? | ? | ? | ? | ? | ? |
Notes spécifiques à SpiderMonkey
Pour les versions antérieures à SpiderMonkey 28 (Firefox 28 / Thunderbird 28 / SeaMonkey 2.25 / Firefox OS 1.3), Object.getOwnPropertyNames
ne listait pas les propriétés non-résolues des objets Error
. Cela a été résolu dans les versions suivantes (bug 724768).