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.
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.