2014-02-11 64 views
0

我正在做一個蛇遊戲,但是當我嘗試和實例化我的蛇對象時,我得到「Uncaught TypeError:undefined不是函數」。對象不會被創建?

function draw(){ 
var canvas = document.getElementById("canvas"); 
    if (canvas.getContext){ 
     var ctx = canvas.getContext('2d'); 
} 
drawSnake();  

} 

這是我實例化對象的蛇和借鑑,並在那裏我得到的錯誤更具體線路13

function drawSnake(){ 
    var Snake = new Snake(250,250,-1,0); 
    Snake.create(); 
    ctx.fillStyle = "white"; 
    for(i=Snake.snakeBlock.length(); i>=0;i--){ 
     var s = Snake.snakeBlock[i].block; 
     ctx.fillRect(s.xPos,s.xPos,s.height,s.width); 
    } 
}  

function Block(x,y,w,h){ 
    var xPos = x; 
    var yPos = y; 
    var width = w; 
    var height = h; 
} 

這是我定義的蛇對象但我仍然得到一個錯誤。

function Snake(x,y,dY,dX){ 
    var snakeBlock = []; 
    var length = 20; 
    var xPos = x; 
    var yPos = y; 
    var dirX = dX; 
    var dirX = dY; 
    Snake.prototype.create = function(){ 
     for (var i = 0; i <= length; i++) { 
     snakeBlock.push(new Block((xPos-(i*10))*dirX, (yPos-(i*10))*dirY,10,10)); 
    }; 
} 
} 

在創建對象時我忽略了什麼,因爲我無法弄清楚代碼有什麼問題。

+0

有關構造函數和原型的更多信息,以下答案可能有所幫助:http://stackoverflow.com/a/16063711/1641941 – HMR

回答

1
var Snake = new Snake(250,250,-1,0); 

你想在這裏覆蓋Snake構造?無論如何,declaration of the local variable遮蔽全球Snake構造函數參考和Snakeundefined當您嘗試調用它。使用不同的變量名 - 通常實例名稱小寫:

var snake = new Snake(250, 250, -1, 0); 
for(i=Snake.snakeBlock.length(); i>=0;i--){ 
  • 使用局部變量:var i
  • .length的確不是一個函數:it is a plain, numeric property
  • snakeBlockSnake構造函數中的局部變量,而不是屬性。
var s = Snake.snakeBlock[i].block; 

snakeBlock[i]並已引用Block情況下,你放在那裏。它沒有.block屬性。

var snakeBlock = []; 

如前所述,這確實聲明瞭一個局部變量。你想從外部訪問,但(在原型方法,在您的通話drawSnake),所以你應該建立財產:瞭解更多關於在Javascript: Do I need to put this.var for every variable in an object?差異

this.snakeBlock = []; 

Snake.prototype.create = function(){ 

永遠不要把一個賦值賦給構造函數中的原型!你的縮進也被搞砸了。

snakeBlock.push(…) 

現在,訪問它作爲一個屬性:

this.snakeBlock.push(…) 

也看到@MattWay's fiddle一個固定的後續版本:-)

2

有不少東西錯的代碼已粘貼。我創建了一個非常快速的小提琴,並且調整了你的代碼,以便它不會給出錯誤(儘管它可能不是寫出它的最好方法)。

http://jsfiddle.net/62VDC/

一些我發現事情與不使用this。試圖在名爲Snake的對象的同一時間使用變量名稱Snake。當沒有block組件時參考像snakeBlock[i].block這樣的東西。使用length()時,您應該簡單地使用.length。將prototype函數放入構造器中。

如果您需要更多幫助,您可能需要詳細說明。