2013-04-03 48 views
0

請考慮代碼:的Javascript循環通過原型

// define the GameObject constructor function 

    var GameObject = function(width, height) { 
    this.x = Math.floor((Math.random() * myCanvasWidth) + 1); 
    this.y = Math.floor((Math.random() * myCanvasHeight) + 1); 
    this.width = width; 
    this.height = height; 
    return this; 
}; 

// (re)define the GameObject prototype object 

GameObject.prototype = { 
    x: 0, 
    y: 0, 
    width: 5, 
    width: 5, 
    draw: function() { 
     myCanvasContext.fillRect(this.x, this.y, this.width, this.height); 
    } 
}; 

然後,我們可以實例化遊戲物體的100倍。

var x = 100, 
arrayOfGameObjects = []; 
do { 
    arrayOfGameObjects.push(new GameObject(10, 10)); 
    } while(x--); 

現在我們有100個GameObjects,其中所有共享相同的原型和定義的拉伸方法,所述應用程序內的這大大節省了存儲器的陣列。

當我們調用draw方法時,它會引用完全相同的函數。

var GameLoop = function() { 
    for(gameObject in arrayOfGameObjects) { 
     gameObject.draw(); // this is my problem. Is this correct? gameObject is simply and index who draw() method gets executed 
    } 
}; 

我的問題是最後一行代碼的方法draw()正在執行。由於gameObject只是一個索引,draw()方法如何執行?該索引不包含任何對象。它只是一個索引權?

Here是一個鏈接

回答

1

你真的應該使用您的GameLoop如下:

var GameLoop = function() { 
    for(var i = 0; i < arrayOfGameObjects.length; i++) { 
     arrayOfGameObjects[i].draw(); 
    } 
}; 
+0

你是對的,但由於即時通訊有問題,我需要在這種特殊情況下的幫助 –

+0

需要幫助什麼?上面的代碼回答你的問題... – BenM

+0

看到我的最後一行代碼,其中draw()方法得到執行,這是正確的,因爲var gameObject只保存索引no對象如何執行draw方法? –

0

使用純for遍歷數組進行迭代。

var GameLoop = function() { 
    for (var i = 0; i < arrayOfGameObjects.length; i++) { 
     arrayOfGameObjects[i].draw(); 
    } 
}; 

它實際上是不好的做法是使用for in循環的陣列上,因爲它只是一個大約的方式得到你想要的索引輪。

0

餘像jQuery $。每個

$.each(arrayOfGameObjects, function(i, gObject) { 
    gObject.draw(); 
}); 

否則如所描述的通過其他使用陣列長度使用與迭代。

0
var GameLoop = function() { 
    for(var i = 0, len = arrayOfGameObjects.length; i<len; i++) { 
     gameObject.draw(); 
    } 
}; 

查看http://jsfiddle.net/SdBcx/2/

的一些注意事項這方面的工作:

  • 這是不好的做法,對數組對象使用for(obj in array)。原因是,如果您將自定義函數添加到Array.prototype,自定義函數將出現在for循環中!我在這裏寫了一個這樣的例子:http://jsfiddle.net/BUp6T/
  • 你可以看到我將arrayOfGameObjects.length保存在len變量中。這隻發生一次,在循環執行之前。這比通常的解決方案快得多:for(var i = 0; i < arrayOfGameObjects.length; i++)每個單循環迭代檢索數組長度。