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.