2011-12-23 23 views
0

只是試驗JS +畫布,我似乎碰壁了。 我的最小應用程序的「目標」是點擊畫布上的任意位置,按下繪製按鈕並在您點擊的地方繪製正方形。javascript類型問題:未捕獲TypeError:對象0沒有方法'繪製'

來自面向對象的背景......我(試過)使用面向對象,這在JS我沒有完全掌握。

但基本上我有一個自定義的方形物體

function Square(l, w, x, y) { 

    this.length = l; 
    this.width = w; 
    this.posx = x - l/2; 
    this.posy = y - w/2; 

    //test 
    //ctx.fillStyle = "rgb(20,0,0)"; 
    //ctx.fillRect(this.posx,this.posy,this.length,this.width); 


    this.draw = function() { 

     ctx.fillStyle = "rgb(20,0,0)"; 
     ctx.fillRect(this.posx,this.posy,this.length,this.width); 

    } 
} 

我在用戶每次點擊一次添加到一個數組... 這裏是當我點擊畫布上的事件處理程序。

function addTo(evt) { 

    pos = getMousePos(evt); 
    var sq = new Square(50, 50, pos.x, pos.y); 
    list.push(sq); 

    output.innerText = "("+sq.posx+","+sq.posy+")"; 
} 

這裏是我在哪裏(嘗試)畫正方形。

function renderStack() { 

    //alert(list); 
    canvas.width = canvas.width; 
    for(var o in list) o.draw(); 

} 

,這是錯誤:

Uncaught TypeError: Object 0 has no method 'draw' 

,我收到了類似的錯誤嘗試訪問該變量爲對象。 看來,我將它們添加到列表中後,js忘記了它們是什麼類型? - 因爲當我打印數組時它充滿[Object object]的

謝謝。

+0

偏離主題,但從構造函數中取出'draw'方法,並將它放在'prototype'上。 'Square.prototype.draw = func ...' – 2011-12-23 15:36:33

+0

謝謝,JS新手,尤其是對象的任何好資源;我讀過一些相互矛盾的東西。 – 2011-12-23 15:53:58

回答

4
for(var o in list) 

o是數組的索引(或財產)。您將通過list[o]訪問存儲在該索引處的內容。

但是對於陣列,最好使用for循環,如Alnitak所示,比for-in

更新:

對於-在被使用時您需要通過所有屬性循環。由於數組是一個具有索引和屬性的對象。因此,for-in將迭代所有的索引和屬性。 for-in更適合對象。

例如

var obj = { p1: 1, p2: 2}; 

for(var prop in obj) { 
    //... 
} 
+0

@ cream-corn:查看更新。這可能會給出一些暗示,爲什麼不爲for-in數組:http://jsfiddle.net/BGurung/5tbdh/。 – 2011-12-23 15:41:35

+1

@ cream-corn:'for-in'用於枚舉。在JavaScript中,最好不要在數組上使用,因爲您會擊中所有可枚舉的屬性,並且人們喜歡擴展數組。所以當你想要所有可枚舉的屬性時,你使用'for-in'。當你想要迭代索引時使用'for'。這不是你問題的原因。問題是在'key'上調用'.draw()',而不是使用'key'來獲取'value'。你選擇的答案有誤導性的信息。這個答案比較好。 – 2011-12-23 15:42:28

+0

是的,我現在意識到這一點和我的方式的錯誤。感謝所有的快速回復:) – 2011-12-23 15:46:48

5

for ... in ...給你一個對象的而不是它的內容。因此,對陣列

您將收到兩個索引存儲的元素的名其他任何枚舉的屬性的

相反,你應該使用:

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

數組是一個對象。直接的錯誤是在鍵(String)上調用方法而不是值。雖然你說得對,最好使用'for'語句。 – 2011-12-23 15:32:13

+1

@amnotiam文本固定 - 我正在寫它匆忙。 – Alnitak 2011-12-23 16:13:08

+0

+1更新。 – 2011-12-23 16:44:13

相關問題