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

Não sei o erro

Criei um arquivo para praticar o que aprendi na aula, porem minha função de adicionar valor no atributo não está indo, ja revisei varias vezes e mudei o codigo e nada, por fim vim recorrer ao forum, obrigado galera!

const bonecoEldenRing ={
        nome: "Camille",
        level: 50,
        classe: "samurai",
        atributos:{
            dex: 21,
            str: 15,
            vigor: 20,
        },
        equipament:{
            arma1: "rapiera +10",
            arma2: "escudo",
            armor: "media",

        },
        upar:function( status, valor) //função que era para upar o "vigor" mas nao to conseguindo
        {
            this.status += valor
        },
        uparLevel: function(valor) // função para upar o level do personagem, essa é mais simples e funciona
            {
                this.level += valor
            }

}

function armas(obj)
{
    const info = Object.keys(obj) //keys , pega as propriedades do objeto e lista todas em forma de array
    if(info.includes("equipament")) // ve se dentro da "info" existe a propriedade "equipament" e seleciona ela
    {
        console.log(`Hmm.. sua arma é uma ${obj.equipament.arma1} e sua classe é ${obj.classe}`)
    }
}   

armas(bonecoEldenRing) // executa a função, dentro dela ja exite um console.log, ou seja, o retorno dela ja imprime no console
console.log(bonecoEldenRing.atributos)

bonecoEldenRing.upar("vigor",5) // função puxada do objeto porem nao funciona

console.log(bonecoEldenRing.atributos)

bonecoEldenRing.uparLevel(10) //executa a função de upar level

console.log(bonecoEldenRing.level)

console.log(bonecoEldenRing.atributos.vigor)
2 respostas
solução!

Olá, Breno!

Conheço bem pouco de JS,mas vou tentar lhe ajudar.

Acho que o erro se deve ao fato de que a sua propriedade atributos também é um objeto, então o JS não consegue fazer essa "pesquisa em camadas" e localizar a propriedade vigor dentro de atributos.

Uma maneira simples de resolver isso (não sei se é a melhor maneira) seria acessando atributos, e a partir dele, pesquisar a chave passada como argumento para somar o valor, assim:

upar:function(status, valor) 
{
    this.atributos[status] += valor;
 }

Porém, desta maneira, se passarmos uma propriedade que não existe em atributos, acabaremos criando uma nova propriedade em tempo de execução, e não é isso que queremos. Podemos resolver isso utilizando a função hasOwnProperty(propriedade), que verifica se uma propriedade existe em um objeto, e retorna true em caso de sucesso, ou false, caso contrário.

O código ficaria assim:

upar:function(status, valor) 
{
    if(this.atributos.hasOwnProperty(status)) {
        this.atributos[status] += valor;
    }
 }

Espero ter ajudado!

Boa sorte em seus estudos!

Muito obrigado, Matheus! Consegui entender no que estava errando e aprendi com a função que passou.