Olá Danilo!
Sua dúvida é super pertinente! Pesquisamos um pouco sobre o assunto, veja se responde a sua dúvida:
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.
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.