3
respostas

[Projeto] Atributos privados

Comecei a utilizar o '#' antes dos atributos para deixar eles privados e não funciona como se colocasse o '_' O certo não seria começar a funcionar, depois que foi aprovado a utilização do #?

3 respostas

Olá, Gustavo, tudo bem?

Segundo a documentação, as propriedades privadas são criadas usando um prefixo hash # e não podem ser referenciadas legalmente fora da classe. O encapsulamento de privacidade dessas propriedades de classe é imposto pelo próprio JavaScript. A única maneira de acessar uma propriedade privada é por meio da notação de ponto, e você só pode fazer isso dentro da classe que define a propriedade privada.

Caso não esteja funcionando, pode ser que haja algum erro de sintaxe. Você pode compartilhar seu código conosco para que possamos avaliar se existe algum erro desse tipo. Também recomendo muito a leitura da documentação MDN sobre propriedades privadas, que pode te ajudar a ter uma melhor compreeensão. Está em inglês, mas você consegue ler normalmente com a tradução automática do navegador.

Caso precise de ajuda com o código, não hesite em compartilhar conosco. Conte com o apoio do fórum!

Uma abraço e bons estudos!

Caso este post tenha lhe ajudado, por favor, marcar como solucionado ✓. Bons Estudos!

Segue o código: (única alteração que acredito que foi feita entre o meu código e o código da aula foi a utilização do # ao inves do _ (na aula ele diz que só usa o _ pois ainda não tinha sido aprovado o uso do #...)

index.js

import { Cliente } from "./Cliente.js";
import { ContaCorrente } from "./ContaCorrente.js";
import { ContaPoupanca } from "./ContaPoupanca.js";

const cliente1 = new Cliente('Gustavo', 52136524844)

const contaCorrente1 = new ContaCorrente(1001, cliente1)
contaCorrente1.depositar(400)

const contaPoupanca = new ContaPoupanca(50, cliente1, 1001)

console.log(contaPoupanca)

Cliente.js

export class Cliente{
   
    constructor(nome, cpf){
        this.nome = nome
        this.#cpf = cpf
    }

    get cpf(){
        return this.#cpf
    }

}

ContaCorrente.js

import { Cliente } from "./Cliente.js";

export class ContaCorrente{
    
    static numeroDeContas = 0;

    set cliente(novoValor){
        if(novoValor instanceof Cliente){
            this.#cliente = novoValor
        }
    }

    get cliente(){
        return this.#cliente
    }


    get saldo(){
        return this.#saldo
    }

    constructor(agencia, cliente){
        this.agencia = agencia
        this.cliente = cliente
        this.#saldo = 0

        ContaCorrente.numeroDeContas += 1
    }

    sacar(valor){
        if(valor < this.#saldo){
            this.#saldo -= valor
            return valor
        }
    }

    depositar(valor){
        if(valor < 0) return
        this.#saldo += valor
    }

    transferir(valor, conta){
        const valorSacado = this.sacar(valor)
        conta.depositar(valorSacado)
    }
}

ContaPoupanca.js

export class ContaPoupanca{

    constructor(saldoInicial, cliente, agencia){
        this.#saldo = saldoInicial 
        this.#cliente = cliente
        this.#agencia = agencia
    }

    sacar(valor){
        if(valor < this.#saldo){
            this.#saldo -= valor
            return valor
        }
    }

    depositar(valor){
        if(valor < 0) return
        this.#saldo += valor
    }

    transferir(valor, conta){
        const valorSacado = this.sacar(valor)
        conta.depositar(valorSacado)
    }
}

Oi, Gustavo!

Sobre sua última dúvida, o problema está no uso do # para declarar atributos privados, que precisa estar totalmente integrado ao seu ambiente de desenvolvimento para funcionar. O suporte para campos privados com # depende do ECMAScript mais recente e do ambiente de execução (por exemplo, Node.js ou navegadores atualizados). Caso o seu ambiente esteja atualizado e ainda assim os atributos privados não funcionem, revise a sintaxe das declarações.

No seu código, é importante garantir que todas as declarações privadas estejam dentro da classe. Por exemplo, ao declarar #saldo e #cliente, faça da seguinte forma:


export class ContaCorrente {
    #saldo = 0;
    #cliente;

    constructor(agencia, cliente) {
        this.agencia = agencia;
        this.#cliente = cliente;
        ContaCorrente.numeroDeContas += 1;
    }

    // outros métodos...
}

Fico à disposição. Abraços e bons estudos!

Caso este post tenha lhe ajudado, por favor, marcar como solucionado ✓. Bons Estudos!