La méthode Object.getOwnPropertyNames() renvoie un tableau de toutes les propriétés (qu'elles soient énumérables ou non, tant qu'elles ne sont pas désignées par un symbole) 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 ES2015, 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 ES2015

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 Latest Draft (ECMA-262)
La définition de 'Object.getOwnPropertyNames' dans cette spécification.
Standard évolutif  

Compatibilité des navigateurs

FonctionnalitéChromeEdgeFirefoxInternet ExplorerOperaSafari
Support simple5 (Oui)49125
FonctionnalitéAndroidChrome for AndroidEdge mobileFirefox for AndroidIE mobileOpera AndroidiOS Safari
Support simple (Oui) (Oui) (Oui) (Oui) (Oui) (Oui) (Oui)

Notes spécifiques à Firefox

Pour les versions antérieures à Firefox 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).

Voir aussi

Étiquettes et contributeurs liés au document

 Contributeurs à cette page : SphinxKnight
 Dernière mise à jour par : SphinxKnight,