2017-07-13 2 views
0

Ich versuche OOP zu verstehen und dies ist mein erster echter Versuch. Ich bin verwirrt, warum die word Eigenschaftsvariable im init Objekt in der checkLetter Funktion console.log nicht verfügbar ist, obwohl ich das this Schlüsselwort verwende. In meiner pickWord Funktion kann ich this.word ohne Probleme verwenden. Wie kann ich die word Variable und this.word.length für checkLetter verfügbar machen?Eigenschaftsvariable undefined im Objektliteral mit diesem Schlüsselwort

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

Sie scheinen zu wissen, dass '' this' in checkLetter' * als Klick-Handler aufgerufen * bezieht sich auf das Klickelement, wie Sie die Dinge verwenden wie 'this.style' oder' this.innerHTML'. Warum erwarten Sie, dass es gleichzeitig auf das 'init'-Objekt zeigt? – Bergi

+0

In Ihrem Fall ist die Behebung einfach, beziehen Sie sich stattdessen auf 'init.word'. – Bergi

+0

Ich erwartete, auf das Objekt zu zeigen, da es innerhalb des Objekts erstellt wird. Der Grund, warum es nicht funktioniert, ist, weil ich den onclick in der 'addKeys' -Funktion erstelle und dann versuche,' word' selbst in der 'checkLetter' -Funktion zu verwenden, da er den Verweis auf das 'this' Schlüsselwort aus dem verliert Objekt? – oxxi

Antwort

1

Der Ereignishandler key.onclick wird im Kontext des Elements aufgerufen. Das ist also das Element. Es gibt zahlreiche Möglichkeiten, dieses Problem zu umgehen. Ein solcher Weg ist, den Wert von ‚this‘ auf das init-Objekt zu binden:

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

Edit: Wenn Sie den Zugriff auf das Element der Event-Handler benötigen, können Sie das Ereignis als Funktionsparameter umfassen, und das Element zugreifen Verwenden der Eigenschaft 'currentTarget'. Z.B. evt.currentTarget.

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

Ich habe die 'this.checkLetter.bind (this);' in der addKeys-Funktion und jetzt nicht ausgeführt, wenn ich auf die Elemente klicke. Wie würde ich auch auf die Variable 'word' in der' checkLetter' Funktion zugreifen? Wie folgt: 'if (point == elem.word.length)'? – oxxi

+0

Es hat eine Weile gedauert, bis die Dinge einen Sinn ergaben, aber alles was ich zu tun hatte war 'if (elem.innerHTML == letterElems [i] .innerHTML)' und dann fing alles an zu arbeiten und ich konnte 'if (point = = this.word.length) '. Dieses Problem hat mir geholfen, so viel über 'this' zu lernen. – oxxi

+0

Das ist großartig! Meine JavaScript-Programmierung verbesserte sich dramatisch, als ich erfuhr, wie 'this' funktioniert. –

Verwandte Themen