2017-07-13 2 views
0

J'essaie de comprendre la POO et c'est ma première véritable tentative. Je suis confus pourquoi la variable de propriété word dans l'objet init n'est pas disponible dans la fonction console.log checkLetter même si j'utilise le mot clé this. Dans ma fonction pickWord je suis capable d'utiliser this.word sans aucun problème. Comment puis-je rendre la variable word et this.word.length disponible à ?Variable de propriété indéfinie dans le littéral d'objet utilisant ce mot-clé

var words = ["cancer", "aids", "stroke", "diabetes" ]; 

var keys = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z']; 

point = 0; 

var init = { 
    word: "", 
    word_index: 0, 
    point_status: 0, 
    pickWord: function(){ 
    this.word = words[this.word_index]; 
    this.displayDashes(this.word); 
    }, 

    displayDashes: function(word){ 
    for(var i = 0; i< word.length; i++){ 
     var blankLetter = document.createElement("div"); 

     var hiddenletter = document.createTextNode(word[i]); 
     blankLetter.appendChild(hiddenletter); 

     blankLetter.classList.add('dashes'); 

     var wordHolder = document.getElementById('wordHolder'); 

     wordHolder.appendChild(blankLetter); 


    } 

    }, 

    addKeys: function(){ 
    for (var i = 0; i < keys.length; i++){ 
     var key = document.createElement("div"); 
     key.classList.add('keys'); 

     key.onclick = this.checkLetter; 

     var letter = document.createTextNode(keys[i]); 
     key.appendChild(letter); 

     var keyboard = document.getElementById('keyboard'); 

     keyboard.appendChild(key); 


    } 
    }, 

    checkLetter: function(){ 

    var letterElems = document.getElementsByClassName('dashes'); 

    this.style.backgroundColor = 'blue'; 

    for(var i = 0; i < letterElems.length; i++){ 
    if(this.innerHTML == letterElems[i].innerHTML){ 
     letterElems[i].style.backgroundColor = 'white'; 
     pointStatus = point++; 

    } 
    } 
    // checkPoints(pointStatus); 
    // console.log(point); 
    console.log("the word: " + this.word); 

    if(point == this.word.length){ 
     alert('you won ' + point + " points so far!"); 
     this.nextWord(); 

    } 
    }, 


    nextWord: function(){ 
     alert('im inside nexword'); 
     this.word_index++; 
     this.pickWord(); 
    } 
} 

init.pickWord(); 
init.addKeys(); 
// init.displayDashes(); 
+0

Vous semblez savoir que '' this' dans checkLetter' * appelé en tant que gestionnaire de clic * fait référence à l'élément cliquée, comme vous utilisez des choses comme '' this.style' ou this.innerHTML'. Pourquoi attendez-vous qu'il pointe vers l'objet 'init' en même temps? – Bergi

+0

Dans votre cas, le correctif est facile, il suffit de se référer à 'init.word' à la place. – Bergi

+0

Je m'attendais à pointer vers l'objet car il est créé à l'intérieur de l'objet. Donc, la raison pour laquelle cela ne fonctionne pas à l'origine est parce que je crée l'onclick dans la fonction 'addKeys' et que j'utilise' word' par lui-même dans la fonction 'checkLetter' il perd la référence au mot clé' this' de la objet? – oxxi

Répondre

1

Le gestionnaire d'événements key.onclick est appelé dans le contexte de l'élément. Donc 'ceci' est l'élément. Il existe de nombreuses façons de contourner ce problème. Une telle façon est de lier la valeur de « ceci » à l'objet init:

key.onclick = this.checkLetter.bind(this); 

Edit: si vous avez besoin d'accéder à l'élément du gestionnaire d'événements, vous pouvez inclure l'événement en tant que paramètre de fonction, et accéder à l'élément en utilisant la propriété 'currentTarget'. Par exemple. evt.currentTarget.

checkLetter: function(evt){ 
    var elem = evt.currentTarget; 
+0

J'ai fait 'this.checkLetter.bind (this);' dans la fonction addKeys et maintenant il ne s'exécute pas lorsque je clique sur les éléments. Comment accéder à la variable 'word' dans la fonction' checkLetter'? Comme ceci: 'if (point == elem.word.length)'? – oxxi

+0

Il m'a fallu un certain temps pour que les choses aient du sens mais tout ce que j'avais à faire était 'if (elem.innerHTML == letterElems [i] .innerHTML)' et tout a commencé à fonctionner et je pouvais utiliser 'if (point = = this.word.length) '. Ce problème m'a beaucoup aidé à apprendre 'ceci' – oxxi

+0

C'est génial! Ma programmation JavaScript s'est considérablement améliorée quand j'ai appris comment cela fonctionne. –