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

Uncaught TypeError: Cannot set property saldo of #<Conta> which has only a getter

Olá novamente a todos do Alura, nesta parte do curso eu realizei a criação da classe conta e criei suas filhas, segue o código:

class Conta {

  constructor(saldo) {
      this.saldo = saldo;
  }

  get saldo() {
      return this.saldo;
  }

  atualiza(taxa) {
      throw new Error("Este método necessita ser implementado");
  }
}

class ContaCorrente extends Conta {

    atualiza(taxa) {
      this.saldo += taxa;
  }
}

class ContaPoupanca extends Conta {

  atualiza(taxa) {
      this.saldo += taxa * 2;
  }
}


let CC = new ContaCorrente(100);
let CP = new ContaPoupanca(100);

Ao executar o código, recebo o erro que descrevi no assunto deste tópico.

Agradeceria qualquer tipo de ajuda, pois eu não sei porque eu recebo este erro uma vez que eu passo o valor pro construtor e o erro me diz que ele não pode fazer isso porque a classe conta possui apenas um getter.

3 respostas
solução!

Boa tarde cangaceiro JavaScript!

O problema no seu código é o seguinte. Você definiu um getter chamado get saldo(). Você não pode ter um getter com o mesmo nome de uma propriedade de classe.

Veja essa linha:

  constructor(saldo) {
      this.saldo = saldo;
  }

O JavavaScript vai acessar o this.saldo vai estar atribuindo o novo valor a um getter, porque para ele agora this.saldoé o get saldo().

Para resolver, ou você cria um set saldo(valor) ou mude a propriedade interna da classe. Aliás, eu ensino isso no curso a boa prática de usar um prefixo com _ para indicar para o programador que a propriedade é privada. Então, alterando seu código temos:

class Conta {

  constructor(saldo) {
      this._saldo = saldo;
  }

  get saldo() {
      return this._saldo;
  }

  atualiza(taxa) {
      throw new Error("Este método necessita ser implementado");
  }
}

class ContaCorrente extends Conta {

    atualiza(taxa) {
      this._saldo += taxa;
  }
}

class ContaPoupanca extends Conta {

  atualiza(taxa) {
      this._saldo += taxa * 2;
  }
}


let CC = new ContaCorrente(100);
CC.atualiza(100);
console.log(CC.saldo);
let CP = new ContaPoupanca(100);
CP.atualiza(100);
console.log(CP.saldo);

Lembre-se: uma propriedade da classe não pode ter o mesmo nome de um getter ou um setter, Use o prefixo _.

Obrigado Professor! Lembro de você mostrar isso, porém, eu fiz esse código meio que de forma rápida e sem me atentar a esse detalhe, mesmo analisando não consegui resolver o problema ou lembrar do detalhe. Aprendi muito com o primeiro curso da carreira de engenheiro javascript, aprendi muito com você, excelente didática, excelente professor! Estou feliz e contente com o curso e espero poder me tornar um especialista nisto um dia, quem sabe, hehe. Está mais do que resolvido, obrigado!

JavaScript é um caminho enriquecedor. Seu conhecimento adquirido, quase que a maioria dele pode ser aplicado no backend inclusive em banco de dados.

Se quiser trilhar o caminho de um cangaceiro JavaScript, depois de terminar os cursos avançados, estude sobre Node.js. Inclusive a Alura pode ajudá-lo em sua jornada.

Sucesso e bom estudo Alessandro!