Conseguem me explicar de forma mais detalhada como funciona fazer copia e referencia no JS, e também referente ao método Object.create(). Não entendi muito bem na hora da pratica.
Você está vendo a versão anterior da nova experiência da Alura que estamos preparando para você. Em breve, ela ganha uma identidade visual novinha totalmente pensada em potencializar seus estudos!
Conseguem me explicar de forma mais detalhada como funciona fazer copia e referencia no JS, e também referente ao método Object.create(). Não entendi muito bem na hora da pratica.
Oi, Sara!
Vou te explicar:
Tipos primitivos (cópia de valor)
Quando você trabalha com tipos primitivos (números, strings, booleanos, null, undefined, symbol, bigint), o JavaScript cria uma cópia do valor.
Ou seja, cada variável guarda o seu próprio valor independente da outra.
Exemplo:
let a = 10
let b = a
b = 20
console.log(a) // 10
console.log(b) // 20
Aqui, a e b são independentes, cada um tem sua própria caixinha na memória.
Objetos (referência na memória)
Já com objetos, arrays e funções, o que acontece é diferente: a variável guarda apenas um endereço de memória que aponta para o objeto.
Quando você faz const obj2 = obj1, os dois apontam para o mesmo lugar.
Exemplo:
const obj1 = { nome: "Gandalf" }
const obj2 = obj1
obj2.nome = "Saruman"
console.log(obj1.nome) // Saruman
console.log(obj2.nome) // Saruman
Mesmo alterando só obj2, o obj1 também muda, porque os dois são a mesma coisa na memória.
Se você quiser ter um novo objeto independente, aí sim precisa fazer uma cópia manual ou usar algum método. Alguns exemplos:
Object.assign()const obj1 = { nome: "Gandalf" }
const obj2 = Object.assign({}, obj1)
obj2.nome = "Saruman"
console.log(obj1.nome) // Gandalf
console.log(obj2.nome) // Saruman
...)const obj1 = { nome: "Gandalf" }
const obj2 = { ...obj1 }
obj2.nome = "Saruman"
console.log(obj1.nome) // Gandalf
console.log(obj2.nome) // Saruman
Object.create()?Esse método é um pouco diferente.
Ele cria um novo objeto que tem como protótipo o objeto passado como parâmetro.
Exemplo:
const obj1 = { nome: "Gandalf" }
const obj2 = Object.create(obj1)
obj2.nome = "Saruman"
console.log(obj1.nome) // Gandalf
console.log(obj2.nome) // Saruman
O que acontece aqui?
obj2 não é uma cópia simples de obj1.obj1 como protótipo.obj2, ele vai "herdar" do obj1.Olha só:
console.log(obj2.classe) // undefined (se não definirmos)
obj1.classe = "Mago"
console.log(obj2.classe) // Mago (herdado do protótipo)
Ou seja, Object.create() é mais usado para criar objetos com herança prototípica, e não exatamente para copiar.
Object.assign() ou spread ({ ...obj }).Object.create(): cria um objeto novo que herda do protótipo do original, útil para herança, não para simples cópia.Espero ter ajudado.