Como imprimir ou enumerar propriedades de um objeto JavaScript?
Neste post, exploraremos todas as opções para iterar e imprimir propriedades de um objeto JavaScript.
Neste post, vamos explorar todas as opções para iterar e imprimir propriedades de um objeto JavaScript. Normalmente encontro os seguintes requisitos,
- Como imprimir o nome de todas as propriedades de um objeto?
- Como imprimir apenas os métodos de um objeto?
- Como imprimir até propriedades não enumeráveis de um objeto?
Vamos considerar o gato-objeto, como mostrado na lista abaixo:
var cat= {
name : 'foo',
age : 12,
canRun : function() {
console.log("can run");
}
}
Por padrão, para todas as propriedades de um objeto, enumerável é definido como verdadeiro. Então, neste momento, se imprimirmos a descrição do canRun do cat e nomearmos propriedades usando o Object.getOwnPropertyDescriptor, encontraremos um valor enumerável verdadeiro para ambas as propriedades.
console.log(Object.getOwnPropertyDescriptor(cat,"canRun")); console.log(Object.getOwnPropertyDescriptor(cat,'name'));
Como você percebeu, além de enumerável, configurável e gravável também são definidos como verdadeiro.

Vamos começar imprimindo todas as propriedades que enumeráveis são verdadeiras.
Printing all enumerable properties using for..in loop
Podemos imprimir todas as propriedades enumeráveis, sejam próprias ou herdadas do objeto cat, usando JavaScript para... em loop.
for (var prop in cat) {
console.log(prop);
}
Usando o para... no ciclo, todas as propriedades enumeráveis podem ser iteradas. O loop for acima irá imprimir todas as propriedades enumeráveis do objeto gato.

JavaScript para... o loop in não itera propriedades não enumeráveis nem para propriedades que enumerável é definida como falsa. Para entender melhor, vamos fazer com que a propriedade do nome do gato seja enumerável para falsa usando a função Object.defineProperty.
Object.defineProperty(cat, 'name', {
enumerable: false
});
for (var prop in cat) {
console.log(prop);
}
Na listagem acima, definimos enumerable of name property em false, e então iteramos para as propriedades usando o JavaScript for loop. Na saída, você notará que o JavaScript omitiu a propriedade de nome, e fornecerá a saída conforme mostrado na imagem abaixo

JavaScript para... em loop itera para todas as propriedades enumeráveis de um objeto, independentemente de ser sua própria propriedade ou propriedade herdada. Vamos ver um exemplo de como para... no laço também retorna propriedades enumeráveis herdadas. Eu criei um objeto chamado animal,
var animal= {
color: "blue"
}
Estamos ligando o objeto animal como pai do objeto gato usando o __proto__ . Portanto, estamos criando herança entre o objeto gato e o objeto animal, conforme mostrado na lista abaixo:
cat.__proto__ = animal;
Agora, o objeto gato possui três propriedades enumeráveis. Ele tem suas próprias propriedades de idade e canRun, além de propriedades de cor herdadas. Então o para... no loop vai imprimir as propriedades idade, canRun e cor do objeto gato.
for (var prop in cat) {
console.log(prop);
}
Acima para... In loop vai imprimir a propriedade de cor além da idade e da propriedade canRun.

Abaixo, encontra-se todo o código usado na discussão acima,
var animal= {
color: "blue"
}
var cat= {
name: 'foo',
age: 12,
canRun: function () {
console.log("can run");
}
}
cat.__proto__=animal;
Object.defineProperty(cat, 'name', {
enumerable: false
});
for (var prop in cat) {
console.log(prop);
}
Então podemos resumir para... em loop nos seguintes pontos,
- Ele retorna todas as propriedades enumeráveis do objeto
- Ele retorna todas as propriedades enumeráveis herdadas do objeto
- Ela não retorna propriedades não enumeráveis
Imprimindo todas as propriedades enumeráveis próprias usando Object.keys
No ECMA 5, foi introduzido o Object.keys(), que retorna um array contendo todas as propriedades enumeráveis do objeto JavaScript. Ele retorna apenas as propriedades do próprio objeto; não devolve propriedades herdadas.
Podemos imprimir todas as propriedades enumeráveis do objeto gato usando Objecy.keys, como mostrado na listagem abaixo.
var cat= {
name: 'foo',
age: 12,
canRun: function () {
console.log("can run");
}
}
console.log(Object.keys(cat));
Impressão de todos os métodos de um objeto
Podemos ter outro requisito, apenas imprimir todos os próprios métodos de um objeto. Para isso, vamos criar uma função que retornará todos os próprios métodos de um objeto.
function getAllMethods(object) {
return Object.getOwnPropertyNames(object).filter(function (p) {
return typeof object[p]=='function';
});
}
a função getAllMethods() retornará todos os métodos do objeto passado. Vamos supor que temos um gato-objeto como mostrado na próxima listagem,
var cat= {
name: 'foo',
age: 12,
canRun: function () {
console.log("can run");
}
}
Para imprimir métodos do objeto cat, passaremos para a função getAllMethods(), e a função retornará o método canRun.
console.log(getAllMethods(cat));
Na saída, podemos ver canRun impresso.

Conclusão
Neste post, aprendemos sobre várias formas de imprimir ou enumerar propriedades e métodos próprios ou herdados de objetos. Espero que você ache este post útil. Obrigado por ler.