6
respostas

console.log imprimir variáveis privadas (#)

Olá.. parabéns pelo curso, está muito didático!

Estou usando a versão mais recente do node e nele, está identificando as variáveis privadas utilizando # Minha dúvidas é como imprimir (console.log) objeto com seus atributos privados. Minha esperança era utilizando "get" mas nos meus testes aqui, isso não funcionou.

Pode me ajudar com essa ? obrigado.

6 respostas

Olá Marcelo, tudo bom?

O Javascript não tem variáveis publicas e privadas, o que acontece é usar um acordo de cavalheiros no qual os programadores definem que variáveis com underscore (this._variableName) são privadas, mas elas são acessíveis de qualquer lugar,

O get e o set são métodos para escrever nas variáveis, retornando o valor delas.

Quando vc faz assim, voce define uma variável privada _nome, usa o set e o get para dar valor e retornar valor, depois vc pode usar o this.nome como se fosse um atalho para o get e o set.

Abra o seu console e coloque esse código, vc vai ver q a variável privada _nome é visível

class Test {
    _nome = null;
    set nome(value) {
        this._nome = value;
    }

    get nome() {
        return this._nome;
    }

    init() {
        this.nome = "Diego";
        console.log(this.nome);
    }
}
test = new Test()
test.init()
console.log(test)

O que eu não entendi é onde e pq vc quer imprimir o valor delas?

Abraços

Obrigado Diego pala resposta.

Isso que vc disse, o instrutor passou no curso. Mas passou também que estava em andamento a possibiliade de patronizar o uso de # para definir variáveis privadas no escopo da classe. Quando fiz isso aqui no meu código, funcionou. Segue exemplo da classe:

export class Cliente {
    nome;
    #cpf;

    constructor(nome, cpf) {
        this.nome = nome;
        this.#cpf = cpf;
    }
    get cpf() {
        return this.#cpf;
    }
}

quando faço: const cliente1 = new Cliente("Ricardo", 11122233309);

console.log(cliente1.cpf); imprime o CPF... 11122233309

mas quando imprimo console.log(cliente1);

sai apenas o nome, da seguinte forma: Cliente { nome: 'Ricardo' }

O que queria saber é da possibilidade de imprimir o objeto interiro, quando utiliza as definições de atributos privados.

Oi Marcelo,

Agora faz sentido, a padronizacao do # para atributos privados é algo recente https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Classes

A idéia do atributo privado é justamente essa, de nao ser acessível pra fora da classe de maneira que seja somente usado internamente. Caso contrario pode quebrar a lógica.

Por curiosidade eu tentei imprimir no meu console e está aparecendo normalmente. Verifique dentro do prototype

Insira aqui a descrição dessa imagem para ajudar na acessibilidade

Muito obrigado Diego pela presteza amigo.

Creio que você esteja vendo a variável #cpf devido a versão do seu compilador/interpretador, portanto, para o seu interpretador o #cpf é uma variável como outra qualquer, sem considerar o "privado" ( # ).

Estou usando a versão mais recente (node-v14.18.0).

Oi Marcelo, beleza?

Desculpe a confusão, eu estava usando o próprio navegador para executar o javascript.

Tem um artigo muito interessante sobre isso aqui https://javascript.info/private-protected-properties-methods

Mas respondendo a sua pergunta inicial. Não é possível imprimir o objeto com seus atributos privados. Atributos privados devem ser usados apenas dentro do escopo da classe. Se voce quer imprimir elas, primeiro torne-as públicas. O get e set são funções que servem mais como um atalho para escrever e acessar o atributo privado, mas ele nao vai mostrar no objeto assim como não mostra os outros métodos públicos do Objeto.

class Cliente {
    nome;
    #cpf;

    constructor(nome, cpf) {
        this.nome = nome;
        this.cpf = cpf; // Aqui nos usamos o shortcut criado pelo get set para escrever no atributo.
    }

    set cpf(value) {
        // aqui nos acessamos o atributo privado e escrevemos um valor
        this.#cpf = value;
    }

    get cpf() {
        // aqui nos retornamos o valor do atributo privado que foi escrito pelo set
        return this.#cpf;
    }
}

const cliente1 = new Cliente("Ricardo", 11122233309);
console.log(cliente1);

Espero ter ajudado um pouco.

Muito obrigado amigo. Valeu mesmo :)