Este artigo necessita de uma revisão editorial. Como posso ajudar.
Esta tradução está incompleta. Ajude atraduzir 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 propreidades, enumeráveis ou não, serão retornadas.
Descrição
Object.getOwnPropertyNames()
returna um vetor cujo elementos são strings correndentes 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 ordençã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
Em ES5, se o argumento desse método não é um objeto (um tipo primitivo), então isso causará um TypeError
. Em 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. |
Standard |
Definição inicial. Implementado em JavaScript 1.8.5. |
ECMAScript 2015 (6th Edition, ECMA-262) The definition of 'Object.getOwnPropertyNames' in that specification. |
Standard | |
ECMAScript 2017 Draft (ECMA-262) The definition of 'Object.getOwnPropertyNames' in that specification. |
Draft |
Compatibilidade em navegadores
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).