Solucionado (ver solução)
Solucionado
(ver solução)
2
respostas

[Dúvida] A questão do prototype

Estava experimentando com a fç User (ela é considerada uma fç construtora?) e ao dar log na variável estudante o output é somente o objeto vazio. Porém, logando estudante.perfil o output é 'estudante'. A dúvida no caso é por quê a propriedade 'perfil' não é logada se o console.log for somente 'estudante' mas ela é possível de ser lida com estudante.perfil? O que está acontecendo por trás dos panos aqui? Obrigado.

function User() {}
User.prototype.perfil = 'estudante'
let estudante = new User()
console.log(estudante)

// saída:
User {}
console.log(estudante.perfil)

//saída:
estudante
2 respostas
solução!

Oii Daniel, tudo bem?

O que tá acontecendo no seu caso é uma característica de como o JavaScript lida com propriedades herdadas através do protótipo. Quando você cria um novo objeto estudante usando a função construtora User com new User(), esse objeto estudante é criado com um protótipo que é o objeto User.prototype. Isso significa que estudante não possui diretamente a propriedade perfil, mas sim herda essa propriedade de seu protótipo.

Quando você faz console.log(estudante), o JavaScript mostra apenas as propriedades próprias do objeto estudante, que, no seu caso, tá vazio porque não foram definidas propriedades diretamente nele, apenas no protótipo. Por isso, você vê User {} como saída, indicando um objeto User vazio.

Por outro lado, quando você acessa estudante.perfil, o JavaScript procura essa propriedade no objeto estudante. Como ela não tá diretamente nele, o JavaScript então procura no protótipo de estudante, que é User.prototype, onde encontra a propriedade perfil definida como 'estudante'. Assim, console.log(estudante.perfil) retorna 'estudante'.

Esse comportamento destaca uma das poderosas características da programação orientada a objetos em JavaScript, que é a capacidade de herdar propriedades e métodos de um objeto protótipo, permitindo reutilização e compartilhamento de comportamentos.

Espero que essa explicação tenha esclarecido sua dúvida sobre por que a propriedade perfil não aparece quando você loga o objeto estudante diretamente, mas é acessível através de estudante.perfil. É tudo uma questão de como o JavaScript trata propriedades próprias versus propriedades herdadas do protótipo.

Um abraço e bons estudos.

Obrigado pela resposta!