javascript - 使用 this 关键字在对象字面量中未定义属性变量

标签 javascript oop scope this object-literal

我正在尝试理解 OOP,这是我第一次真正的尝试。我很困惑为什么 word init 中的属性变量对象在 checkLetter 中不可用即使我使用 this 功能 console.log关键词。在我的pickWord我可以使用this.word功能没有任何问题。我怎样才能制作word变量和this.word.length可供 checkLetter

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();

最佳答案

key.onclick 事件处理程序在元素的上下文中调用。所以“这个”就是元素。有多种方法可以解决此问题。其中一种方法是将“this”的值绑定(bind)到 init 对象:

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

编辑:如果您需要访问事件处理程序的元素,可以将事件作为函数参数包含在内,并使用“currentTarget”属性访问该元素。例如。 evt.currentTarget。

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

关于javascript - 使用 this 关键字在对象字面量中未定义属性变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45070813/

相关文章:

javascript - 你如何从 Angular 更新 HTML5 Canvas ?

c# - 抽象方法和开闭原则

Php/OOP 如何避免同一个类的实例访问其他对象的私有(private)属性/方法

matlab - 在matlab中为对象动态添加一个字段

javascript - meteor 变量范围

c# - Dapper/EF - 为什么当变量不在使用范围内时性能会提高

javascript - 有趣的 Javascript RegExp 测试

javascript - 如何从功能标签的页面源代码中获取值?

javascript - 将 <div> 滚动到特定内容

python - Python 中有模块级变量吗?