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

Valores primitivos e não primitivos

Pesquise sobre valores primitivos e não primitivos e ainda sim continuo com dúvida. Segundo o professor do vídeo, o teste feito alterando o objeto "valor" dentro do método transferir não foi efetivo devido a natureza do objeto de tipo number ser primitivo e imutável, porém, reparei que ele alterou a variável após a realização do método, e fiz o teste com a alteração após o método transferir. E deu certo, houve alteração.

class ContaCorrente {
  saldo = 0
  cliente

  sacar(valor) {
    if (this.saldo >= valor) {
      this.saldo -= valor
      return valor
    }
  }

  depositar(valor) {
    if (valor <= 0) {
      return
    }
    this.saldo += valor
  }

  tranferir(valor, conta) {
    this.sacar(valor)
    conta.depositar(valor)
  }
}

const cliente1 = new Cliente()
cliente1.nome = 'Ricardo'

const cliente2 = new Cliente()
cliente2.nome = 'Alice'

const contaCorrenteRicardo = new ContaCorrente()
contaCorrenteRicardo.cliente = cliente1

const contaCorrenteAlice = new ContaCorrente()
contaCorrenteAlice.cliente = cliente2

contaCorrenteRicardo.saldo = 200

const valor = 20
contaCorrenteRicardo.tranferir(valor, contaCorrenteAlice)

console.log(contaCorrenteAlice)
console.log(contaCorrenteRicardo)

Realizando esse código, o terminal imprime a resposta correta, sendo o saldo de Ricardo 180 e o de Alice 20. Alterando a variável valor depois da realização do método, não houve mudança no terminal

tranferir(valor, conta) {
    this.sacar(valor)
    conta.depositar(valor)
    valor = 30
  }

Já alterando o variável valor antes da realização do método, obtemos uma alteração no terminal :

tranferir(valor, conta) {
    valor = 30
    this.sacar(valor)
    conta.depositar(valor)
  }

Dessa maneira, o computador entendo a variável valor como 30, ou seja, ela pode sim ser alterada.

3 respostas

Fala Davi, tudo bem? Espero que sim!

O que ele quis dizer é que, no método nós não conseguimos alterar o valor de fora, somente dentro do método, ou seja, se fizermos essa alteração:

tranferir(valor, conta) {
    valor = 30
    this.sacar(valor)
    conta.depositar(valor)
  }

O valor dentro desse método mudará sim, porém, a variável que passamos para esse método continuará a mesma:

const valor = 20
contaCorrenteRicardo.tranferir(valor, contaCorrenteAlice)

console.log(valor) //20

Isso pois valor é um numero, então é passado por valor e não por referência.

Agora, caso passassemos um objeto:

const valor = {
    valorASerTransferido: 20
}
contaCorrenteRicardo.tranferir(valor, contaCorrenteAlice)

E alterar o valor dessa propriedade no método:

tranferir(valor, conta) {
    valor.valorASerTransferido = 30
    this.sacar(valor.valorASerTransferido)
    conta.depositar(valor.valorASerTransferido)
  }

Também refletirá no objeto que passamos como parâmetro:

const valor = {
    valorASerTransferido: 20
}
contaCorrenteRicardo.tranferir(valor, contaCorrenteAlice)

console.log(valor.valorASerTranferido) //30

Pois um objeto é passado por referência e não por valor.

Então independente se passarmos algo por referência ou por valor, o que importa é se a mudança vai influenciar na variável que estamos recebendo ou não, porque de qualquer forma somos capazes de mudar os valores dos parâmetros que recebemos, por isso você conseguiu fazer essa alteração. Você fez a alteração NO PARÂMETRO e não na variável.

Espero ter ajudado, abraços e bons estudos :D

Acho que entendi sim. Então podemos, dentro de um método, alterar o valor de um objeto, mas não de uma variável, certo?

solução!

Não necessariamente de uma variável, e sim de uma variável que é passada por valor (numeros e strings), é mais ou menos isso mesmo.