mozilla

Object.getOwnPropertyNames()

Résumé

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.

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()); // affiche "0,1,2,length"

// Objet semblable à un tableau (array-like)
var obj = { 0: "a", 1: "b", 2: "c"};
console.log(Object.getOwnPropertyNames(obj).sort()); // affiche "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()); // affiche "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 Statut 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 6 (ECMA-262)
La définition de 'Object.getOwnPropertyNames' dans cette spécification.
Draft  

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 ? ? ? ? ? ?

Tableau basé sur le tableau de compatibilité de Kangax.

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).

Voir aussi

Étiquettes et contributeurs liés au document

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