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

[Dúvida] Cartas Undefined

Estou com o seguinte problema: Insira aqui a descrição dessa imagem para ajudar na acessibilidadeAlguém poderia me ajudar? Revisei meu código e não encontrei onde está meu erro e o console também não mostra nada.

index.js --------

import { Personagem } from "./personagem.js";
import { PersonagemView } from "./components/personagem-view.js";

const personagemPedrinho = new Personagem('Pedrinho', 5, 'Mago');
const personagemJose = new Personagem('Jose', 3,'Arqueiro');

const personagens = [personagemPedrinho, personagemJose];

new PersonagemView(personagens).render();

personagem.js ---------

export class Personagem {
    nome
    vida
    mana
    level
    tipo
    descricao

    constructor(nome, level, tipo) {
        nome = this.nome;
        level = this.level;
        tipo = this.tipo;
    }

    obterInsignia() {
        if (this.level >= 5){
            return `Implacável ${this.tipo}`
        } 
        return `${this.tipo} iniciante`
    }
}

personagem-view.js ---------

export class PersonagemView {
    personagens

    constructor(personagens) {
        this.ulPersonagens = document.querySelector('ul#personagens');
        this.personagens = personagens;
    }

    render() {
    this.ulPersonagens.innerHTML = '';
    this.personagens.forEach(personagem => {
        const personagemLI = this.criaPersonagem(personagem)
        this.ulPersonagens.appendChild(personagemLI)
    })
}

criaPersonagem = (personagem) => {
    const personagemLI = document.createElement('li')
    personagemLI.classList.add('personagem', personagem.tipo)

    //const estaSelecionado = this.personagensSelecionados.indexOf(personagem) !== -1 //sintaxe para quando encontra no array

    //if (estaSelecionado) personagemLI.classList.add('selecionado')

    personagemLI.innerHTML =

    `
    <div class="container-superior">
        <div class="cabecalho">
            <div class="combate"></div>
            <div class="level">
                <button class="diminuir-level">-</button>
                <p class="level-texto">Level ${personagem.level} </p>
                <button class="aumentar-level">+</button>
            </div>
        </div>
        <div class="container-imagem">
            <div class="imagem"></div>
            <div class="container-tipo">
                <h2 class="tipo">${personagem.tipo}</h2>
            </div>
        </div>
        <div class="container-nome">
            <h3 class="nome">${personagem.nome}</h3>
        </div>
        <div class="container-descricao">
            <p class="descricao"></p>
        </div>
    </div>
    <div class="container-inferior">
        <img src="./src/assets/img/icone-mana.png" class="icone-mana">
        <p class="insignia">${personagem.obterInsignia()}</p>
        <img src="./src/assets/img/icone-vida.png" class="icone-vida">
        <h4 class="mana"></h4>
        <h4 class="vida"></h4>
    </div>
    `

    /*const containerLevel = personagemLI.querySelector('.level')
    containerLevel.onclick = (evt) => {
        evt.stopPropagation()

        if (evt.target.classList.contains('diminuir-level')) personagem.diminuirLevel()

        if (evt.target.classList.contains('aumentar-level')) personagem.aumentarLevel()

        this.render()
    }*/


    /*personagemLI.onclick = () => {
        const jaTem2Selecionados = this.personagensSelecionados.length === 2
        if (!jaTem2Selecionados || estaSelecionado) {
            personagemLI.classList.toggle('selecionado')

            if (!estaSelecionado) return this.adicionaSelecao(personagem)

            this.removeSelecao(personagem)
        }
    }*/

    return personagemLI
}


/*adicionaSelecao = (personagem) => {
    this.personagensSelecionados.push(personagem)
    this.render()
}


removeSelecao = (personagem) => {
    const indexDoPersonagemNoArray = this.personagensSelecionados.indexOf(personagem)
    this.personagensSelecionados.splice(indexDoPersonagemNoArray, 1)
    this.render()
}

escutarEventoDuelo() {
    const botaoDuelar = document.querySelector('.botao-duelar')

    botaoDuelar.addEventListener('click', () => {
        if (this.personagensSelecionados.length < 2) return mostrarModal('Selecione 2 personagens')

        const resultadoDuelo = Personagem.verificarVencedor(this.personagensSelecionados[0], this.personagensSelecionados[1])

        mostrarModal(resultadoDuelo)

        this.personagensSelecionados.splice(0, this.personagensSelecionados.length)

        this.render()
    })
}*/
}
2 respostas

Encontrei o "erro", tinha escrito ao contrário:

constructor(nome, level, tipo) {
    nome = this.nome;
    level = this.level;
    tipo = this.tipo;
}

Arrumei abaixo e ficou certinho, mas não entendi porque a ordem interfere:

    constructor(nome, level, tipo) {
        this.nome = nome;
        this.level = level;
        this.tipo = tipo;
    }
solução!

Oi Alanis! Tudo ok contigo?

Ao criar uma classe em JavaScript, o construtor é responsável por inicializar as propriedades do objeto que está sendo criado. Nesse caso, você está usando o construtor da classe Personagem para definir os valores das propriedades nome, level e tipo.

A ordem faz diferença porque você está atribuindo os valores às propriedades da classe de forma incorreta no primeiro exemplo. Veja o que acontece em cada caso:

  1. Primeiro exemplo:

    constructor(nome, level, tipo) {
        nome = this.nome;
        level = this.level;
        tipo = this.tipo;
    }
    

    Neste caso, você está atribuindo o valor das propriedades da classe às variáveis locais do construtor (que recebem os parâmetros), e não o contrário. Ou seja, nome, level e tipo estão recebendo o valor undefined porque, por padrão, as propriedades da classe são inicializadas com undefined. Por isso, ao usar o this.nome, this.level e this.tipo, você está apenas acessando as propriedades vazias que ainda não foram definidas.

  2. Segundo exemplo (o código corrigido):

    constructor(nome, level, tipo) {
        this.nome = nome;
        this.level = level;
        this.tipo = tipo;
    }
    

    Nesse caso, você está atribuindo corretamente os valores dos parâmetros nome, level e tipo às propriedades da classe this.nome, this.level e this.tipo. Ou seja, você está efetivamente definindo os valores dessas propriedades quando um novo objeto da classe Personagem é criado.

Em resumo, a ordem correta é utilizar this.nome, this.level e this.tipo à esquerda do operador de atribuição = para definir os valores das propriedades da classe. Assim, o objeto será criado com as informações corretas nos seus atributos, e você não terá undefined nas áreas de escrita ao acessar esses atributos posteriormente.

Se tiver mais alguma dúvida ou precisar de assistência em qualquer outro assunto, não hesite em perguntar.

Boa sorte com o seu código e projetos! Tenha um ótimo dia!

Abraços e bons estudos.