Так что теперь, чтобы ответить на ваш актуальный вопрос:
Это не так, как работает объектно-ориентированное программное обеспечение.
Если вы собираетесь использовать объектно-ориентированные методы (и это кажется разумным для этогоиспользуйте тот случай, который вам следует) тогда эти данные принадлежат объекту.Кажется, вы хотите иметь возможность использовать данные, переданные конструктору объекта в других функциях того же модуля.Этими функциями должны быть методы класса Mosaic , иначе вы должны использовать совершенно другой подход.
Для вспомогательной проблемы, связанной с слишком большим количеством параметров, в динамических языках, таких какJavaScript просто передает структуру данных ключ / значение, как объект JavaScript:
class Mosaic {
// here we'll use ES 6 destructuring to pull out the properties we
// care about from the passed-in object
constructor ({
canvas_id,
bg_colour = "#000000", // default arguments still work
tile_size,
tile_border,
tile_qty,
colours
}) {
this.tiles = []; // tiles should be a property
this._canvas = document.getElementById(canvas_id);
this._tile_size = tile_size;
// etc etc
}
}
// note that now we're passing in an object with named properties,
// don't need to remember which is where (less error-prone).
var grid = new Mosaic({canvas_id: "mosaic_canvas", tile_size: 40, /* etc */});
для вашей insertTiles
функции, просто сделайте метод класса:
// in class Mosaic definition
insertTiles () {
var x, y;
for (let i = 0; i < this.tile_qty; i++) {
x = (this._tile_size + this._tile_border) * Math.floor(Math.random() * (this._canvas_width / this._tile_size)),
y = (this._tile_size + this._tile_border) * Math.floor(Math.random() * (this._canvas_height / this._tile_size)),
console.log("fff");
this.tiles.push(newTile(x, y, this._colours));
}
}
Youможет внести некоторые изменения в это (например, плитки не обязательно должны быть «публичными»), но, вообще говоря, именно так мы поступаем в JS-стране.