1
resposta

O set parece não funcionar

Olá, estou com problema ao alterar o nome de "cliente" para "_cliente" em ContaCorrente.js eu perco a referência de cliente no index.js, pois aparece cliente está indefinido.


Erro no powershell:

conta1.cliente.nome = "Ricardo"; ^

TypeError: Cannot set properties of undefined (setting 'nome')

index.js

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

const conta1 = new ContaCorrente();
conta1.agencia = 1001;
conta1.cliente = new Cliente();
conta1.cliente.nome = "Ricardo";
conta1.cliente.cpf = 12345678912;

const conta2 = new ContaCorrente();
conta2.agencia = 1001;
conta2.cliente = new Cliente();
conta2.cliente.nome = "Alice";
conta2.cliente.cpf = 98765432100;

conta1.depositar(500);

conta1.transferir(200, conta2);
console.log(conta1);
console.log(conta2);
console.log(conta3);

ContaCorrente.js

export class ContaCorrente {

    agencia;
    _cliente;

    set cliente(novoValor) {

        this._cliente = novoValor;

    }

    _saldo = 0; 

    sacar(valor) {

        // se o cliente não tem saldo para saque, a função retorna(encerra) antes de deser debitado algum valor da conta
        if(this._saldo < valor) return;

        this._saldo -= valor;

        return valor;
    }

    depositar(valor) {

         if(valor <= 0) return;

         this._saldo += valor;

         return valor;

    }

    transferir(valor, conta) {
        if(valor > this._saldo) return;
        const valorSacado = this.sacar(valor);

        conta.depositar(valorSacado);

        return valorSacado;
    }
}
1 resposta

Fala, Bruno! Tudo bem ?

Primeiramente, peço desculpa pela demora em te dar um retorno.

O problema está acontecendo porque ele está tentando setar um valor em um atributo que está indefinido. Mais para frente no curso, o professor irá utilizar construtores para construir esse exemplo o que vai melhorar essa forma de construir os clientes. Mas, por enquanto, conseguimos resolver isso facilmente.

const conta1 = new ContaCorrente();
conta1.agencia = 1001;
conta1.cliente = new Cliente();
conta1.cliente.nome = "Ricardo";
conta1.cliente.cpf = 12345678912;

Analisando esse trecho do código podemos perceber que ele está criando o objeto conta 1 da classe ContaCorrente, adicionando o valor da agência, depois você tenta criar outro objeto já dentro desse e colocar os valores dentro dele de forma manual. E aqui onde está ocorrendo o erro, estamos tentando definir uma propriedade em um valor indefinido, que não foi inicializado.

Uma forma de corrigir esse problema, seria utilizando os construtores que vão ser explicados mais à frente no curso, eles basicamente fazem a inicialização do objeto e seus atributos quando são criados, então não vai acontecer esse problema. O Código dessa parte ficaria da seguinte forma: Cliente.js

export class Cliente{
    nome;
    cpf;

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

E para construir o objeto faríamos isso na hora de criá-lo:


const conta1 = new ContaCorrente();
conta1.agencia = 1001;
conta1.cliente = new Cliente( "Ricardo", 12345678912);


const conta2 = new ContaCorrente();
conta2.agencia = 1001;
conta2.cliente = new Cliente( "Alice", 98765432100);

Essa forma feita acima iria resolver o problema. Tem uma outra maneira de resolver o problema, simplesmente criando primeiro o objeto cliente por completo e depois passando ele para dentro do objeto Conta Corrente, da seguinte forma:

const conta1 = new ContaCorrente();
conta1.agencia = 1001;
//Cria o Cliente
const cliente = new Cliente();
cliente.nome = "Ricardo";
cliente.cpf = 12345678912;
//Adiciona o cliente na conta
conta1.cliente = cliente; 

Isso vai resolver o problema da mesma forma.

Espero que tenha ajudado e qualquer outra dúvida estou por aqui.

Abraço e Bons Estudos!

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

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software