2011-11-05 91 views
0

我有一個 '對象':JavaScript方法沒有找到

function Rock() 
{ 
    this.size = 30.0; 
    this.body; 
    this.isDead = false; 

    this.vertexPosBuffer; 
    this.vertexColBuffer; 
} 

我給一個函數:

Rock.prototype.Tick = function() 
{ 
    this.body.ApplyForce(new b2Vec2(0, 10), this.body.GetPosition()); 
} 

然後我使岩石的數組:

var rocks; 
function NewRandomRock() 
{ 
    var newRock = new Rock; 
    var pos = new b2Vec2; 
     pos.x = Math.random()*(gl.viewportWidth+1); 
     pos.y = Math.random()*(gl.viewportHeight+1); 
    newRock.InitRand(pos); 
    rocks.push(newRock); 
} 

然後我打電話給Tick功能:

function TickRocks() 
{ 
    for(var rock in rocks) 
    { 
     rock.Tick(); 
    } 
} 

現在的問題,我得到以下錯誤:

Uncaught TypeError: Object 0 has no method 'Tick'

雖然「InitRand(......)」的方法,我添加到巖以同樣的方式,沒有工作......

我在做什麼錯?

回答

2

你的問題是使用for in不是爲迭代數組而設計的。它列舉了對象屬性。

您應該使用正常的循環:

for(var i = 0; i < rocks.length; i++) { 
    rocks[i].Tick(); 
} 
+1

這只是愚蠢的!但是啊,現在我學到了一些東西:D謝謝! –

1

你必須初始化變量:

function Rock() { 
    this.size = 30.0; 
    this.body = {};  //Initialize at an object 
    ... 
} 
var rocks = []; //Initalize an array 
function NewRandomRock() { 
    ... 

而且,由於rocks是一個數組,我建議循環使用for(; ;)

function TickRocks() 
{ 
    for(var i=0, l=rocks.length; i<l; i++) 
    { 
     var rock = rocks[i]; 
     rock.Tick(); 
    } 
} 
+0

我有一個'初始'方法,我使用初始化所有的變量;)(我這樣做,因爲有時我需要重新初始化對象)。 無論如何感謝:D –