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.