Skip to content

Instantly share code, notes, and snippets.

@bsshenrique
Created September 25, 2023 01:10
Show Gist options
  • Save bsshenrique/179beb218ac5d73102214825e7813f19 to your computer and use it in GitHub Desktop.
Save bsshenrique/179beb218ac5d73102214825e7813f19 to your computer and use it in GitHub Desktop.
Principais maneiras de obter as propriedades de um objeto

Principais maneiras de obter as propriedades de um objeto

Este é um breve resuminho demonstrando as principais formas de obter as propriedades de um objeto, algo bem simples mas com alguns detalhes bem legais.

Resumo

Característica Object.getOwnPropertyNames Object.keys for...in
Enumerável ☑️ ☑️ ☑️
!Enumerável ☑️ - -
Herança - - ☑️

Exemplo

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

Detalhes

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)) { }
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment