递增一个柜台

Tud*_*tol -2 javascript increment

我有以下代码

class battleShips {
  constructor(squareNr) {
    this.squareNr = squareNr;
    this.createField();
  }
  createField() {
    let shipsCount = 0;
    for (let i = 0; i < this.squareNr; i++) {
      let fieldSquare = document.createElement("div");
      fieldSquare.className = "squareStyle";
      document.querySelector(".arrayWrap").appendChild(fieldSquare);
      fieldSquare.setAttribute("value", "false");
      this.selectShips(fieldSquare, shipsCount);
    }
  }
  selectShips(square, count) {
    square.addEventListener("click", function() {
      if (square.getAttribute("value") === "false") {
        square.setAttribute("value", "true");
        square.style.backgroundColor = "green";
        count += 1;
        console.log(count);
        document.querySelector(".shipCounter").textContent = "You have selected " + count + " ships";
      } else {
        square.setAttribute("value", "false");
        square.style.backgroundColor = "white";
        count -= 1;
        document.querySelector(".shipCounter").textContent = "You have selected " + count + " ships";
      }
    })
  }
}

var a = new battleShips(25);
Run Code Online (Sandbox Code Playgroud)
.arrayWrap {
  height: 500px;
  width: 500px;
  border: black solid;
  margin: 0 auto;
  display: flex;
  flex-wrap: wrap;
}

.squareStyle {
  height: 98px;
  width: 98px;
  border: 1px black solid;
}
Run Code Online (Sandbox Code Playgroud)
<div class="arrayWrap"></div>
<p class="shipCounter"></p>
Run Code Online (Sandbox Code Playgroud)

我想要实现的是,每次单击一个正方形时,shipsCount变量都会增加1,但正如您在下面的段落中所看到的,如果我记录计数变量,它只增加一次,而不是超过1.

我可以改变什么才能使其按预期工作?

alp*_*am8 5

您需要存储count为类实例的属性.到目前为止,您只需将其置于本地,因此在单击功能完成后将其删除.因此,只需将以下行添加到构造函数中:

this.count = 0;
Run Code Online (Sandbox Code Playgroud)

并在增量/减量功能中使用它.而已!;-)

编辑:这不是全部.我们这里还有一个尚未解决的范围问题.关键字this在事件处理程序中具有另一个上下文.这this不是类范围,例如,它是该事件处理程序的范围,在我们的例子中是单击处理程序.许多开发人员陷入困境的非常讨厌的JavaScript问题.我这次也是.对不起.下面您将看到普通旧JavaScript中的完整工作代码示例.每次该类的实例都给出事件处理程序不是一个很好的方法,但是它有效(参见consoloe日志,它实际上是向上或向下计数的同一个实例):

<!DOCTYPE html>
<html>
<head>
    <title>Test</title>
    <script type="text/javascript">
        class battleShips
        {
          constructor(squareNr)
          {
            this.squareNr = squareNr;
            this.createField();
            this.count = 0;
          }

          createField()
          {
            let shipsCount = 0;
            for (let i = 0; i < this.squareNr; i++) {
              let fieldSquare = document.createElement("div");
              fieldSquare.className = "squareStyle";
              document.querySelector(".arrayWrap").appendChild(fieldSquare);
              fieldSquare.setAttribute("value", "false");
              this.selectShips(fieldSquare, this);
            }
          }

          selectShips(square, battleShipsInstance)
          {
            square.addEventListener(
                "click",
                function() {
                    if (square.getAttribute("value") === "false") {
                        square.setAttribute("value", "true");
                        square.style.backgroundColor = "green";
                        battleShipsInstance.count++;
                        console.log("Battleships count=", battleShipsInstance.count);
                        console.log("Battleships instance", battleShipsInstance);
                        document.querySelector(".shipCounter")
                            .textContent = "You have selected "
                            + battleShipsInstance.count
                            + " ships";
                    } else {
                        square.setAttribute("value", "false");
                        square.style.backgroundColor = "white";
                        battleShipsInstance.count--;
                        document.querySelector(".shipCounter")
                            .textContent = "You have selected "
                            + battleShipsInstance.count
                            + " ships";
                    }
                }
            );
          }
        }

        document.addEventListener(
            "DOMContentLoaded",
            function(event) {
                var a = new battleShips(25);
            }
        );
    </script>
    <style type="text/css">
        .arrayWrap {
            height: 500px;
            width: 500px;
            border: black solid;
            margin: 0 auto;
            display: flex;
            flex-wrap: wrap;
        }

        .squareStyle {
            height: 98px;
            width: 98px;
            border: 1px black solid;
        }
    </style>
</head>
<body>
    <div class="arrayWrap"></div>
    <p class="shipCounter"></p>
</body>
</html>
Run Code Online (Sandbox Code Playgroud)