Перейдём к делу, как я, кажется, уже говорил ранее, класс — это такая особенная переменная, которая может содержать другие переменные (поля), а также собственные функции (методы). В этой главе наша программа не научится делать ничего нового, при запуске произойдёт всё тоже самое, что и при запуске программы из прошлой главы. Изменился лишь сам код. Такое изменение программы называется рефакторингом.
Что же я поменял? Я выделил новый класс «minesClass» и перенёс туда часть переменных и функций. Для чего мне это понадобилось? Я решил отделить логику программы от её интерфейса. То есть класс «minesClass» ничего не будет знать о нашей таблице, однако он сам расставит бомбы при своём создании, а затем останется лишь их нарисовать.
Предлагаю читателю посмотреть на то, что получилось, а затем я всё–таки попытаюсь объяснить ему, что стало лучше.
>
>
>head>
>
> function minesClass(aRowCount, aColCount, aMinesCount)
> {
> this.intRand = function(maxVal)
> {
> return Math.floor((maxVal‑1) * Math.random() + 0.5) — 1;
>}
> this.fillMines = function()
> {
> var res = new Array(this.rowCount * this.colCount);
> var mines = this.minesCount;
> while (mines > 0)
> {
> var n = this.intRand(this.rowCount * this.colCount‑1);
> if (res[n] != 1)
> {
> res[n] = 1;
> mines--;
>}
>}
> return res;
>}
> this.colCount = aColCount;
> this.rowCount = aRowCount;
> this.minesCount = aMinesCount;
> this.mines = this.fillMines();
>}
> function initTable()
> {
> var mines = new minesClass(10, 10, 10);
> var tbl = document.getElementById(«tbl»);
> for (var i = 0; i < mines.rowCount; i++)
> {
> var row = tbl.insertRow(i);
> for(var j = 0; j < mines.colCount; j++)
> {
> var cell = row.insertCell(j);
> if (mines.mines[i * mines.rowCount + j] == 1)
> cell.innerHTML = '*'
> else
> cell.innerHTML = '.';
>}
>}
>}
> script>
>
Короче и понятнее, ничего лишнего. Сразу видно, что к чему относится. Представте, что у вас в программе есть таблица для игры mines и одновременно есть таблица для игры в точки. Довольно трудно будет сказать в этом случае, что значит переменная rowCount. А вот если написано mines.rowCount, сразу всё понятно. Перейдём к функции minesClass. Это по сути и есть наш новый класс. В JavaScript класс — это просто функция, а чтобы создать новый экземпляр классна нужно перед вызовом функции написать слово new. В этой функции мы инициализируем методы intRand, fillMines, colCount, rowCount, minesCount и mines. В JavaScript методы также могут быть полями. Например, так мы описываем новый метод intRand. По сути переносим его в класс minesClass. Я бы прочитал это так: поле «intRand» соответствует (равно) функции, которая принимает максимальное значение в качестве единственного параметра и возвращает случайное целое число от нуля до этого числа.>
> table>
>body>
>html>
> this.intRand = function(maxVal)
> {
> return Math.floor((maxVal‑1) * Math.random() + 0.5) — 1;
>}