Este é um breve resuminho demonstrando as principais formas de obter as propriedades de um objeto, algo bem simples mas com alguns detalhes bem legais.
Característica | Object.getOwnPropertyNames | Object.keys | for...in |
---|---|---|---|
Enumerável | ☑️ | ☑️ | ☑️ |
!Enumerável | ☑️ | - | - |
Herança | - | - | ☑️ |
const usuario = {
nome: 'Joãozinho',
idade: 20
}
Object.defineProperty(
usuario,
'segredo',
{
enumerable: false,
value: 'Não enumerável'
}
)
Object.setPrototypeOf(usuario, { heranca: 'Uma herança' })
Object.keys(usuario) // nome, idade
Object.getOwnPropertyNames(usuario) // nome, idade, segredo
for (const key in usuario) { } // nome, idade, heranca
Se você achou estranho a propriedade "herança", vale a pena conferir essa explicação:
JavaScript é um pouco confuso para desenvolvedores com experiência em linguagens baseadas em classes (como Java ou C++), porque é dinâmico e não dispõe de uma implementação de uma class (a palavra-chave class foi introduzida no ES2015, mas é syntax sugar, o JavaScript permanece baseado em prototype).
Quando se trata de herança, o JavaScript tem somente um construtor: objetos. Cada objeto tem um link interno para um outro objeto chamado prototype. Esse objeto prototype também tem um atributo prototype, e assim por diante até o que o valor null seja encontrado como sendo o seu prototype. null que, por definição, não tem prototype, e age como um link final nesta cadeia de protótipos (prototype chain).
Herança e cadeia de protótipos (prototype chain)
Ao utilizar o for...in
é possível garantir que apenas as propriedades definidas no próprio objeto sejam acessadas, inclusive, o VSCode oferece um snippet com essa validação.
for (const key in object) {
if (Object.hasOwnProperty.call(object, key)) { }
}