3
respostas

Erro ao adicionar nova propriedade específica na classe ContaPoupanca

Estou tentando inserir uma no propriedade chamada 'rendimento' na classe ContaPoupanca. Essa propriedade deve retornar o cálculo do saldo da conta poupança multiplicado pela taxa de rendimento (5%), que representa o rendimento mensal de ContaPoupanca. Ocorre que o resultado retornado pelo cálculo é 0, mesmo tendo realizado um depósito de 500 reais em ContaPoupanca. Poderiam me ajudar a entender qual é o erro e como fazer essa nova propriedade funcionar? Segue abaixo o código da minha classe ContaPoupanca:

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

export class ContaPoupanca extends Conta{

    constructor(cliente,agencia) {
        super(cliente,agencia)
        this.tipo = "poupanca";
        this.rendimento = this.saldo * 0.05;  // this.rendimento não está fazendo o cálculo. Retorna 0.
    }

}

Segue código da minha classe Conta, da qual ContaPoupanca herda as propriedades (cliente, agencia e saldo) e métodos (sacar, depositar e transferir):

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

    set cliente(novoCliente) {
        if(novoCliente instanceof Cliente){
            this._cliente = novoCliente;
        }
    }

    get cliente() {
        return this._cliente;
    }

    get saldo() {
        return this._saldo;
    }

    sacar(valor){
        let taxa = 1;
        const valorSacado = valor * taxa;
        if(this._saldo >= valorSacado){
            this._saldo = this._saldo - valorSacado;
            return valorSacado;
        }
    }

    depositar(valor){
        if(valor >= 0)
        {
            this._saldo = this._saldo + valor;
        }            
    }

    transferir(valor, conta){
        this.sacar(valor);
        conta.depositar(valor);

    }

}

Segue meu código do meu index.js:

const cliente1 = new Cliente("Ricardo", 11122233309);
const cliente2 = new Cliente("Alice", 88822233309);

// <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< CONTAS >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

const contaCorrente1 = new ContaCorrente(cliente1,1001);
const contaPoupanca1 = new ContaPoupanca(cliente1,1001)
const contaCorrente2 = new ContaCorrente(cliente2,1002);

// <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< OPERACOES >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

contaCorrente1.depositar(500);
contaCorrente1.transferir(200, contaCorrente2)
contaPoupanca1.depositar(500);

// <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< CONSOLE.LOG >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

console.log(contaCorrente1);
console.log(contaPoupanca1);
console.log(contaCorrente2);

console.log("Número de Contas Correntes: " + ContaCorrente.numeroDeContas);
3 respostas

Fala, Bruno! Tudo bem?

No momento em que você define o this.rendimento, o valor do this._saldo é zero (porque foi definido assim no construtor super). Então mesmo que depois você chame o rendimento em algum lugar, o valor dele se mantém 0, pois precisa ser redefinido. Você pode fazer um método get para retornar o rendimento:

get rendimento() {
  return this.saldo * 0.05;
}

Espero ter ajudado!

Bom dia. Não funcionou. Coloquei o get da seguinte forma:

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

export class ContaPoupanca extends Conta{

    constructor(cliente,agencia) {
// O 'super' chama o método constructor da classe mãe. Por isso, é necessário passar os mesmos parâmetros
// requeridos pelo constructor da classe mãe.
        super(cliente,agencia)
        this.tipo = "poupanca";
        this.rendimento = 0;
        // this.rendimento não está fazendo o cálculo. Retorna 0.
    }

    get rendimento() {
        return this.saldo * 0.05;
      }

}

Mas ao executar o Node no PowerShell, o resultado foi esse:

file:///C:/Users/Carol/OneDrive/Documentos/Programa%C3%A7%C3%A3o/JavaScript/js-orientacao-objetos/ContaPoupanca.js:10
        this.rendimento = 0;
                        ^

TypeError: Cannot set property rendimento of #<ContaPoupanca> which has only a getter
    at new ContaPoupanca (file:///C:/Users/Carol/OneDrive/Documentos/Programa%C3%A7%C3%A3o/JavaScript/js-orientacao-objetos/ContaPoupanca.js:10:25)
    at file:///C:/Users/Carol/OneDrive/Documentos/Programa%C3%A7%C3%A3o/JavaScript/js-orientacao-objetos/index.js:23:24
←[90m    at ModuleJob.run (internal/modules/esm/module_job.js:152:23)←[39m
←[90m    at async Loader.import (internal/modules/esm/loader.js:166:24)←[39m
←[90m    at async Object.loadESM (internal/process/esm_loader.js:68:5)←[39m
PS C:\Users\Carol\OneDrive\Documentos\Programação\JavaScript\js-orientacao-objetos>

Bruno, o problema é que tanto sua propriedade (this.rendimento) quanto seu getter (get rendimento()) possuem o mesmo nome, então, ao tentar definir o valor da variável, o JavaScript tenta acessar pelo setter (pois sabe da existência do getter).

Você pode mudar o nome da sua variável para this._rendimento e criar um setter.

set rendimento(valorRendimento) {
    this._rendimento = valorRendimento
}

Bons estudos!