Esta tradução está incompleta. Por favor, ajude a traduzir este artigo.

O método Object.getOwnPropertyNames() retorna um vetor com todas as propriedades (enumeráveis ou não) encontradas diretamente em um dado objeto.

Sintaxe

Object.getOwnPropertyNames(obj)

Parâmetros

obj
O objeto, cujas suas próprias propriedades, enumeráveis ou não, serão retornadas.

Descrição

Object.getOwnPropertyNames() retorna um vetor cujos elementos são strings correspondentes as propriedades enumeráveis ou não, encontradas em obj. A ordem das propriedades enumeráveis no vetor é consistente com a ordenação exposta por um laço  for...in (ou por Object.keys()) nas propriedades do objeto. A ordenação das propriedades não-enumeráveis no vetor, e entre as propriedades enumeráveis, não está definida.

Exemplos

Usando Object.getOwnPropertyNames()

var arr = ['a', 'b', 'c'];
console.log(Object.getOwnPropertyNames(arr).sort()); 
// logs ["0", "1", "2", "length"]

// Array-like object
var obj = { 0: 'a', 1: 'b', 2: 'c' };
console.log(Object.getOwnPropertyNames(obj).sort()); 
// logs ["0", "1", "2"]

// Logging property names and values using Array.forEach
Object.getOwnPropertyNames(obj).forEach(function(val, idx, array) {
  console.log(val + ' -> ' + obj[val]);
});
// logs
// 0 -> a
// 1 -> b
// 2 -> c

// non-enumerable property
var my_obj = Object.create({}, {
  getFoo: {
    value: function() { return this.foo; },
    enumerable: false
  }
});
my_obj.foo = 1;

console.log(Object.getOwnPropertyNames(my_obj).sort()); 
// logs ["foo", "getFoo"]

Se voce quer somente as propriedades enumeráveis, veja Object.keys() ou use um laço for...in (contudo, note que isto irá retornar propriedades enumeráveis não encontradas diretamente naquele objeto, mas também junto com a cadeia prototype do objeto a menos que o último seja filtrado com hasOwnProperty()).

Ítens na cadeia prototype não são listados:

function ParentClass() {}
ParentClass.prototype.inheritedMethod = function() {};

function ChildClass() {
  this.prop = 5;
  this.method = function() {};
}
ChildClass.prototype = new ParentClass;
ChildClass.prototype.prototypeMethod = function() {};

console.log(
  Object.getOwnPropertyNames(
    new ChildClass() // ["prop", "method"]
  )
);

Obtenha somente não-enumeráveis

Isto usa a função Array.prototype.filter() para remover as chaves enumeráveis (obtidas com Object.keys()) de uma lista com todas as chaves (obtidas com Object.getOwnPropertyNames()) deixando somente as chaves não-enumeráveis.

var target = myObject;
var enum_and_nonenum = Object.getOwnPropertyNames(target);
var enum_only = Object.keys(target);
var nonenum_only = enum_and_nonenum.filter(function(key) {
  var indexInEnum = enum_only.indexOf(key);
  if (indexInEnum == -1) {
    // not found in enum_only keys mean the key is non-enumerable,
    // so return true so we keep this in the filter
    return true;
  } else {
    return false;
  }
});

console.log(nonenum_only);

Notas

No ES5, se o argumento desse método não é um objeto (um tipo primitivo), então isso causará um TypeError. No ES6, um argumento diferente de objeto será transformado em um objeto.

Object.getOwnPropertyNames('foo');
// TypeError: "foo" is not an object (ES5 code)

Object.getOwnPropertyNames('foo');
// ["0", "1", "2", "length"]  (ES6 code)

Especificações

Esperificação Status Comentário
ECMAScript 5.1 (ECMA-262)
The definition of 'Object.getOwnPropertyNames' in that specification.
Padrão

Definição inicial. Implementado no JavaScript 1.8.5.

ECMAScript 2015 (6th Edition, ECMA-262)
The definition of 'Object.getOwnPropertyNames' in that specification.
Padrão  
ECMAScript Latest Draft (ECMA-262)
The definition of 'Object.getOwnPropertyNames' in that specification.
Rascunho  

Compatibilidade em navegadores

We're converting our compatibility data into a machine-readable JSON format. This compatibility table still uses the old format, because we haven't yet converted the data it contains. Find out how you can help!

Característica Chrome Firefox (Gecko) Internet Explorer Opera Safari
Suporte básico 5 4.0 (2) 9 12 5
Característica Android Chrome for Android Firefox Mobile (Gecko) IE Mobile Opera Mobile Safari Mobile
Suporte básico ? ? ? ? ? ?

Notas específicas para SpiderMonkey

Antes do SpiderMonkey 28 (Firefox 28 / Thunderbird 28 / SeaMonkey 2.25 / Firefox OS 1.3), Object.getOwnPropertyNames não via propriedades não resolvidas de objetos Error. Isto foi resolvido em versões posteriores (bug 724768).

Veja também

Etiquetas do documento e colaboradores

Etiquetas: 
Colaboradores desta página: soter19, deyvidyury
Última atualização por: soter19,