Object.getOwnPropertyNames()
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
Specification |
---|
ECMAScript Language Specification # sec-object.getownpropertynames |
Compatibilidade com navegadores
BCD tables only load in the browser
Notas específicas para SpiderMonkey
Antes do SpiderMonkey 28, Object.getOwnPropertyNames
não via propriedades não resolvidas de objetos Error
. Isto foi resolvido em versões posteriores (Erro do Firefox 724768).