2
respostas

duvida sobre o Object.create()

Eu pensei que este método criava uma copia identica do objeto passado no parâmetro, porem quando eu dou um console.log nesse novo objeto, ele só tem as chaves que eu defini posteriormente, desta forma eu não entendi a real necessidade dele, pois se ele cria um objeto em branco não seria melhor criar um objeto novo?

Codigo:

const objPersonagem = {
  nome: "Gandalf",
  classe: "mago",
  nivel: "20"
}

const objPersonagem2 = Object.create(objPersonagem)
objPersonagem2.nome = "Gandalf, o Cinzento"

console.log(objPersonagem)
console.log(objPersonagem2) 

resposta no terminal:

Object {nome: "Gandalf", classe: "mago", nivel: "20"}

Object {nome: "Gandalf, o Cinzento"}

2 respostas

Oi Danilo, tudo bem?

Olha só... não sei te dizer todo o conceito do Object.create uma maneira que gosto bastante de fazer uma copia de um objeto e tratar os dados dele em um novo objeto é a utilização de spread operator.

Abaixo um exemplo simples para mudança do nivel do seu personagem.

const objPersonagem = {
  nome: "Gandalf",
  classe: "mago",
  nivel: "20"
}

const novo = {
    ...objPersonagem,
    nivel: 50
}

console.log(novo)

Você perceberá que o obj novo terá as informações do anterior porém com nível alterado porque substituimos logo abaixo do spread.

E você poderá criar novos atributos, se quiser...

const novoComEndereco = {
    ...novo,
    endereco: 'floresta'
}

console.log(novoComEndereco)

E se você der um log em todos os objetos você perceberá que o primeiro não foi alterado em nenhum momento.

Espero ter ajudado, Abs.

Olá Danilo!

Sua dúvida é super pertinente! Pesquisamos um pouco sobre o assunto, veja se responde a sua dúvida:

Object.create()

O Object.create(), embora tenha um nome bem sugestivo, não serve para criar cópias de objetos literais. Esse método serve para criarmos um novo objeto sim, porém herdando propriedades do objeto que passamos por parâmetro.

No caso do exemplo do Gandalf, nome, classe e nivel são propriedades do objeto objPersonagem. Quando usamos esse objeto como parâmetro para criar outro objeto usando Object.create(), o que o JavaScript faz é "trazer" as propriedades nome, classe e nivel como propriedades de protótipo. Parecido com o que acontece quando criamos uma nova string com new String() e assim podemos acessar todos os métodos de string do JavaScript (por exemplo slice(), toUpperCase(), etc).

O Object.create() assim, de cara, não parece tão útil, mas quando trabalhamos com objetos mais complexos, que têm métodos específicos, vemos a utilidade para criar, a partir de um objeto modelo, outros que herdem estes métodos.

new Object()

Quando usamos o construtor new Object(), criamos um objeto que herda as propriedades do tipo Object; por exemplo, Object.keys(), Object.assign(), etc. Entre elas, está inclusive a propriedade Object.create()! Você pode conferir a lista de métodos aqui.

Quando usamos new Object() para criar um objeto, cada objeto criado é uma instância diferente, mesmo que tenham as mesmas propriedades e valores. Ou seja, alterações feitas em uma instância não afetam outras.

Por outro lado, para objetos criados da forma literal:

const personagem = {
    nome: "Radagast",
    classe: "mago",
    cor: "castanho"
}

Alterações feitas neste objeto, em qualquer parte do código, alteram o objeto em todo o script.

Você pode conferir mais sobre inicializadores de objeto na documentação da Mozilla e também ver outra resposta para uma dúvida parecida no fórum do QAStack.