Solucionado (ver solução)
Solucionado
(ver solução)
6
respostas

Método transferir retorna NaN

Por algum motivo que não consegui descobrir, quando utilizo o método transferir() ele passa um valor indefinido para o método depositar()

index.js:

contaCorrenteGustavo.depositar(1000) 
contaCorrenteGustavo.transferir(100, contaPoupancaGustavo)

conta.js:

sacar(valor){
        let taxa = 1 
        return this._sacar(valor, taxa)
    }

    _sacar(valor, taxa){
        let valorSacado = taxa * valor 
        console.log(valorSacado)
        if(this._saldo >= valorSacado){
            this._saldo -= valorSacado
            return valorSacado
        }
        return 0
    }

    depositar(valor){
        if(valor <= 0) return
        this._saldo += valor
        console.log(valor)
    }
    transferir(valor, conta){
        const valorSacado = this.sacar(valor)
        conta.depositar(valorSacado)
    }

no terminal está saindo:

1000 (valor depositado na contaCorrenteGustavo)
110.00000000000001 (valor sacado na contaCorrenteGustavo pelo método transferir)
undefined (valor depositado na conta poupanca pelo método transferir)

ContaCorrente {
  _saldo: 890,
  _cliente: Cliente { nome: 'Gustavo', _cpf: 16339421970 },
  _agencia: 1001
}
ContaPoupanca {
  _saldo: NaN,
  _cliente: Cliente { nome: 'Gustavo', _cpf: 16339421970 },
  _agencia: 1001
}

e então o _saldo da conta poupança é retornado como NaN. Não faço ideia de onde esteja o erro, se alguém conseguir ajudar agradeço!

6 respostas

Olá!

Fiz uns testes localmente e consegui reproduzir seu erro ao não inicializar o atributo saldo na classe ContaPoupanca.

Quando um atributo não é inicializado, por padrão, o seu valor é undefined. Com isso, ao utilizar a função depositar (dentro da função transferir), o Javascript está tendo somar undefined com o valor da transferência, resultando em um valor NaN (Not a Number).

Definição da classe ContaPoupanca:

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

export class ContaPoupanca extends Conta {
    constructor(cliente, agencia, saldoInicial) {
        super(cliente, agencia, saldoInicial);
    }

    sacar(valor) {
        let taxa = 1.02;
        return this._sacar(valor, taxa);
    }
}

Replicando o seu cenário com erro, mas inicializando o atributo saldoInicial no construtor da classe ContaPoupanca:

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

const clienteGustavo = new Cliente("Gustavo", 16339421970)
const contaCorrenteGustavo = new ContaCorrente(clienteGustavo, 1001)
const contaPoupancaGustavo = new ContaPoupanca(clienteGustavo, 1001, 0)

contaCorrenteGustavo.depositar(1000) 
contaCorrenteGustavo.transferir(100, contaPoupancaGustavo)

console.log(contaCorrenteGustavo)
console.log(contaPoupancaGustavo)

Saída:

ContaCorrente {
  _cliente: Cliente { _nome: 'Gustavo', _cpf: 16339421970 },
  _agencia: 1001,
  _saldo: 890
}
ContaPoupanca {
  _cliente: Cliente { _nome: 'Gustavo', _cpf: 16339421970 },
  _agencia: 1001,
  _saldo: 110.00000000000001
}

Bom dia, agradeço a resposta, mas fiz como você mencionou que deveria ser feito na classe da conta poupança e o erro ainda persiste :(

Definição da classe ContaPoupanca:

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

export class ContaPoupanca extends Conta{
    constructor(saldoInicial, cliente, agencia){
        super(saldoInicial,cliente,agencia)
    }
}

Index.js:

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

const cliente1 = new Cliente("Gustavo", 16339421970)
const contaCorrenteGustavo = new ContaCorrente(0, cliente1, 1001)
const contaPoupancaGustavo = new ContaPoupanca(0, cliente1, 1001)

contaCorrenteGustavo.depositar(1000) 
contaCorrenteGustavo.transferir(100, contaPoupancaGustavo)

console.log("Número de contas:", ContaCorrente.numeroDeContas)
console.log(contaCorrenteGustavo)
console.log(contaPoupancaGustavo)

Bom dia, Gustavo! Poderia enviar também a definição da sua classe Conta e ContaCorrente?

Claro!

Classe Conta:

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

export class Conta{
    constructor(saldoInicial, cliente, agencia){
        this._saldo = saldoInicial;
        this._cliente = cliente;
        this._agencia = agencia;
    }

    set cliente(novoValor){
        if(novoValor instanceof Cliente){
            this._cliente = novoValor
        }
    }
    get cliente(){
        return this._cliente
    }
    get saldo(){
        return this._saldo
    }

    sacar(valor){
        let taxa = 1 
        return this._sacar(valor, taxa)
    }

    _sacar(valor, taxa){
        let valorSacado = taxa * valor 
        console.log(valorSacado)
        if(this._saldo >= valorSacado){
            this._saldo -= valorSacado
            return valorSacado
        }
        return 0
    }

    depositar(valor){
        if(valor <= 0) return
        this._saldo += valor
        console.log(valor)
    }
    transferir(valor, conta){
        const valorSacado = this.sacar(valor)
        conta.depositar(valorSacado)
    }
}

Classe ContaCorrente:

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

export class ContaCorrente extends Conta{
    static numeroDeContas = 0
    constructor(saldoInicial, cliente, agencia){
        super(saldoInicial, cliente, agencia)
        ContaCorrente.numeroDeContas += 1
    }

    sacar(valor){
        let taxa = 1.1 
        this._sacar(valor, taxa)
    }
}
solução!

Boa tarde!

Achei o problema. A falha está na função sacar da classe ContaCorrente.

Quando você realiza uma transferência, você deve repassar o retorno da função sacar da classe ContaCorrente, porém, não foi definido um return. Isso está fazendo com que a variável valorSacado que está dentro da função transferir receba o valor undefined, por isso, ao tentar somar o saldo da conta poupança com undefined, o resultado é NaN.

Correção da função sacar na classe ContaCorrente:

sacar(valor){
    let taxa = 1.1 
    return this._sacar(valor, taxa)
}

Era isso mesmo mano, muito obrigado! Não sei como deixei passar isso haha

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