6
respostas

Return sempre volta como

Estou tentando utilizar o "return" porém sem êxito.

class bankAccount {
    agency;
    _balance = 0;

    withdraw(amount){
        if (this._balance >= amount) {
            this._balance -= amount;
            //console.log (`Saque de R$${amount} efetuado com sucesso! Saldo restante: R$${this._balance}`);
            return amount;
        } //else {
            //console.log (`Saldo insuficiênte para saque. Saldo disponível: R$${this._balance}`);
        //}
    }

    //

const bankAccount1 = new bankAccount();
bankAccount1.agency = 174;

bankAccount1.deposit(900);
bankAccount1.withdraw(600);

const withdrawn = bankAccount1.withdraw(600);
console.log(withdrawn);

Console:

PS D:\Programação\JavaScript\Estudos> node .\index.js
undefined

O que pode estar acontecendo? Onde esta o erro?

6 respostas

Fala Cauã, tudo bem? Espero que sim!

Provavelmente não está entrando na primeira validação, poderia postar aqui pra gente o código completo da classe bankAccount, por favor?

Aguardo o retorno :D

Olá, Matheus, eu até achei um outro método para continuar e acabei de finalizar o curso, então o código ja está bem mais avançado, mas segue ele:

export class bankAccount {
    _client;
    _balance = 0;
    // // // // //
    agency;
    static numberOfAccounts = 0; // static desossocia a propriedade das instancias.
    // // // // //
    set client(value){
        if (value instanceof Client) //instanceof "instancia de", no caso, a função client
        this._client = value;
    }
    get client(){
        return this._client;
    }
    get balance(){
        return this._balance;
    }
    constructor (client, agency){
        this.client = client;
        this.agency = agency;
        bankAccount.numberOfAccounts += 1; // A propriedade estático é relacionado diretamente a classe
    }
    withdraw(amount){
        if (this._balance >= amount) {
            this._balance -= amount;
            console.log (`Saque de R$${amount} efetuado com sucesso! Saldo restante: R$${this._balance}`);
            withdrawn = amount;
            return amount;
        } else {
            console.log (`Saldo insuficiênte para saque. Saldo disponível: R$${this._balance}`);
        }
    }
    deposit(amount){
        if (amount > 0) {
        this._balance += amount;
        console.log (`Deposito de R$${amount} realizado com sucesso! Saldo atual: R$${this._balance}`);
        } else {
            console.log (`O valor de deposito selecionado não pode ser contabilizado pois é inválido!`)
        }
    }
    transfer(amount, account){
        if (amount <= this._balance && amount > 0) {
            withdrawn = this.withdraw(amount);
            account.deposit(withdrawn);
            console.log (`Tranferência concluida! Seu saldo restante: R$${this._balance}`);
            console.log (`TESTE! Saldo R$${account._balance}`);
        } else {
            console.log ("Ocorreu um erro. Verifique se você possui saldo o suficiênte, a conta informada existe e se o valor está correto!")
        }
    }
    // deposit (amount){
    //    if (amount <=0) return
    //    this._balance -= amount;
    //}
}

Você continua com o erro cauã?

Olá, Matheus, atualmente não, depois de associar o valor de entrada com um variável, já está funcionando do jeito esperado, ainda assim, sem o return, ele tá ali só pra não esquecer dele, pois atualmente está inútil.

Olá Cauã! Tudo bem contigo?

Pelo que entendi no seu primeiro código Cauã, quando você usa bankAccount1.withdraw(600); e em seguida cria a linha const withdrawn = bankAccount1.withdraw(600); a sua variável "withdrawn" recebe dois comandos que realizam "a mesma coisa" ao qual o JavaScript acaba não compreendendo direito. Se você só utilizar a linha const withdrawn = bankAccount1.withdraw(600); ele exibe o valor do return.

Veja abaixo como fiz:

// index.js
import { bankAccount } from "./bankAccount.js";


const bankAccount1 = new bankAccount();
bankAccount1.agency = 174;

//bankAccount1.deposit(900);
//bankAccount1.withdraw(600);

const withdrawn = bankAccount1.withdraw(600);
console.log(withdrawn);
console.log(bankAccount1);

// Classe bankAccount
export class bankAccount {
    agency;
    _balance = 1000; // Aumentei o atributo de valor p/ não usar o método de depósito nessa explicação.

    withdraw(amount){
        if (this._balance >= amount) {
            this._balance -= amount;
            //console.log (`Saque de R$${amount} efetuado com sucesso! Saldo restante: R$${this._balance}`);
            return amount;
        } //else {
            //console.log (`Saldo insuficiênte para saque. Saldo disponível: R$${this._balance}`);
        //}
    }
}

Veja a saída:

600
bankAccount { agency: 174, _balance: 400 }

Depois você testa para ter ideia. Eu estive fazendo algumas pesquisas aqui pra entender o conceito teórico do que causa isso mas eu não conseguir achar uma boa explicação pra que eu li passa-se. Gostaria de entender também o por que disso. Até onde eu vi, é como se a variável, que no nosso caso é const withdrawn nunca fosse inicializada antes, mesmo definindo o valor dela com o objeto criado.

Olá, Cauã! Blz?

Pelo que vi no seu código , você faz uma retirada de 600 e depois tenta fazer mais outra:

bankAccount1.deposit(900);
bankAccount1.withdraw(600);

const withdrawn = bankAccount1.withdraw(600);

Mas lá na validação do método a retirada só poderá ser realizada se o saldo for superior a retirada e como não é, ele não entra na primeira condição e vai entrar no else, mas o seu else está comentado, aí ele não vai executar nada e retornar um undefined.

 if (this._balance >= amount) {
            this._balance -= amount;
            //console.log (`Saque de R$${amount} efetuado com sucesso! Saldo restante: R$${this._balance}`);
            return amount;
        } //else {
                    // Este bloco else estava comentado.
            //console.log (`Saldo insuficiênte para saque. Saldo disponível: R$${this._balance}`);
        //}

No seu segundo código o else não tava comentado, acho que por isso, passou!

Espero ter ajudado, abraço!

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