Доброго времени суток!
Делаю змейку, есть несколько вопросов. Сразу замечу, что я нуб в программировании, поэтому заранее извиняюсь, если что-то не понятно. Попытаюсь объяснить как смогу.
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/