| 
 Вопросы касательно архитектуры приложения на примере змейки Доброго времени суток! Делаю змейку, есть несколько вопросов. Сразу замечу, что я нуб в программировании, поэтому заранее извиняюсь, если что-то не понятно. Попытаюсь объяснить как смогу. 1) Есть конструкторы объектов GameManager, Fruit и Snake: 
function GameManager() {
  // ...
}
function Fruit() {
  // ...
}
function Snake() {
  // ...
}
В GameManager я объявляю свойства snake и fruit и вызываю соответствующие конструкторы: this.snake = new Snake(); this.fruit = new Fruit(); Так я получаю доступ ко всем свойствам и методам Fruit И Snake внутри GameManager. Но дело в том, что в Snake мне необходимо каким-то образом получить значения свойств GameManager, например при выходе за границы поля змейки вызывать сделать Game Over: 
Snake.prototype.move = function () {
	var self = this,
		moveTimer;
	moveTimer = setInterval(function () {
		switch (self.direction) {
			case 'left':
				self.x -= self.cellWidth;
			break;
			case 'up':
				self.y -= self.cellHeight;
			break;
			case 'right':
				self.x += self.cellWidth;
			break;
			case 'down':
				self.y += self.cellHeight;
			break;
		}
		
		addCell.call(self, self.x, self.y);
		if ((self.x < 0 || self.x > GameManager.prototype.width - self.cellWidth) || (self.y < 0 || self.y > GameManager.prototype.height - self.cellWidth)) {
			clearInterval(moveTimer);
			return game.over();
		}
		removeCell.call(self, self.coords[0][0], self.coords[0][1]);
		
	}, this.speed);
	function addCell(x, y) {
		this.coords.push([x, y]);
		GameManager.getCtx().fillStyle = this.cellColor;
		GameManager.getCtx().fillRect(x, y, this.cellWidth, this.cellHeight);
		
		GameManager.getCtx().strokeStyle = this.cellStroke;
		GameManager.getCtx().lineWidth = 2;
		GameManager.getCtx().strokeRect(x, y, this.cellWidth, this.cellHeight);
	}
	function removeCell(x, y) {
		GameManager.getCtx().clearRect(x, y, this.cellWidth, this.cellHeight);
		this.coords.shift();
	}
}
Как это реализовать? 2) Есть конструктор объекта Fruit: 
this.x = null;
	this.y = null;
	this.width = 30;
	this.height = 30;
	var self = this;
	var image = new Image();
	image.onload = function () {
		self.image = image;
	}
	image.src = 'images/grapefruit.png';
	this.image = image;
Внутри него задается изображение, но при заходе на страничку в первый раз оно не загружается, хотя событие onload прописано. Почему? 3) В целом хотелось бы знать - гуанокод или нет? Спасибо! P.S. Весь код можно посмотреть здесь: snake.js Это на jsfiddle/ | 
| 
 держи в объекте только то, что связано с этим объектом. подобные проверки, которые напрямую связаны с менеджером я бы вынес в менеджер, а необходимые свойства змейки и фруктов - получил через геттеры этих объектов | 
| Часовой пояс GMT +3, время: 08:22. |