--- title: Object.getOwnPropertyNames() slug: Web/JavaScript/Reference/Global_Objects/Object/getOwnPropertyNames tags: - ECMAScript 5 - JavaScript - JavaScript 1.8.5 - Méthode - Object - Reference translation_of: Web/JavaScript/Reference/Global_Objects/Object/getOwnPropertyNames original_slug: Web/JavaScript/Reference/Objets_globaux/Object/getOwnPropertyNames ---
{{JSRef}}

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

{{EmbedInteractiveExample("pages/js/object-getownpropertynames.html")}}

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 {{jsxref("Instructions/for...in","for...in")}} (ou avec {{jsxref("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 {{jsxref("Object.keys")}} ou bien une boucle {{jsxref("Instructions/for...in","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 {{jsxref("Object.prototype.hasOwnProperty()", "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 {{jsxref("Array.prototype.filter()")}} pour retirer les clés énumérables (obtenus avec {{jsxref("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 {{jsxref("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
{{SpecName('ES5.1', '#sec-15.2.3.4', 'Object.getOwnPropertyNames')}} {{Spec2('ES5.1')}} Définition initiale.
Implémentée avec JavaScript 1.8.5
{{SpecName('ES6', '#sec-object.getownpropertynames', 'Object.getOwnPropertyNames')}} {{Spec2('ES6')}}  
{{SpecName('ESDraft', '#sec-object.getownpropertynames', 'Object.getOwnPropertyNames')}} {{Spec2('ESDraft')}}  

Compatibilité des navigateurs

{{Compat("javascript.builtins.Object.getOwnPropertyNames")}}

Notes spécifiques à Firefox

Pour les versions antérieures à Firefox 28 {{geckoRelease("28")}}, Object.getOwnPropertyNames ne listait pas les propriétés non-résolues des objets {{jsxref("Error")}}. Cela a été résolu dans les versions suivantes ({{bug("724768")}}).

Voir aussi