Object.getOwnPropertyNames()

Baseline Widely available

This feature is well established and works across many devices and browser versions. It’s been available across browsers since July 2015.

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

Exemple interactif

Syntaxe

js
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()

js
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 (cette méthode renverra é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 :

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

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

js
Object.getOwnPropertyNames('toto')
TypeError: "toto" n'est pas un objet // code ES5

Object.getOwnPropertyNames('toto')
['length', '0', '1', '2']         // code ES2015

Spécifications

Specification
ECMAScript Language Specification
# sec-object.getownpropertynames

Compatibilité des navigateurs

BCD tables only load in the browser

Voir aussi