2012-11-07 49 views
0

我收到了一個非常奇怪的響應,我正在寫一個JS腳本。我對JS有點新,所以我不太瞭解如何改變現有的類(在本例中是Arrays)。在JavaScript中實現Array上的函數

我希望我正確地做這個,但這裏是我試圖運行的代碼的JSFiddles(抽象顯著,但我相信我已經包括了所有的相關部分)

http://jsfiddle.net/UMHn5/

我認爲問題是我不知道如何正確地改變Array類,因爲當我刪除Array.prototype的「刪除」改變時,我得到了一個不同的錯誤(該數組沒有remove函數)。

我得到的例外情況如下:

`Uncaught TypeError: Object function (from, to) { 
var rest = this.slice((to || from) + 1 || this.length); 
    this.length = from < 0 ? this.length + from : from; 
    return this.push.apply(this, rest); 
} has no method 'shift'` 
+0

你不需要remove'加上'以陣列。已經有['splice'](https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Array/splice)。無論如何,您省略了調用此方法的部分。另外,'for(var key in object)'是迭代數組的錯誤方法。使用數字'for'。 – katspaugh

+1

@bhb:'sn'不是'Stroke'對象。 – Guffa

+0

@ katspaugh:我更喜歡「for ... in」解決方案,因爲它允許我從使用索引的方法中抽象出來。坦率地說,如果可以的話,我會使用HashSet。我傾向於認爲這是可擴展的,因爲它也適用於無序的數據結構。 –

回答

1

in for (sn in strokes),如果sn分配給'remove',則會出錯,strokes[sn]的值是您添加到數組而不是筆觸實例的函數。

更改爲

for (var i = 0; i < strokes.length; i++) { 
    strokes[i].shift(.05); 
} 

和測試類型第一

if (typeof strokes[sn] != 'function') { 
    ... 
} 
+0

感謝您的幫助,但這些解決方案都無法正常工作。第二個顯示了很多的承諾,如果你的解釋是正確的,我相信它會起作用。但是,因爲它不起作用,並且控制檯不同意這個函數是數組元素的想法,所以我相信你對該函數是數組元素的說法是不正確的。 –

+0

我的歉意!第一個解決方案*可以工作。我現在得到的錯誤非常相似,但不完全相同,這使我感到困惑。感謝您的幫助! –

0

試試這個:

for (var i = 0; i < strokes.length; i++) { 
    strokes[i].shift(.05); //Where I'm getting the error 
} 

的jsfiddle:http://jsfiddle.net/UMHn5/2/

您還沒有包括在小提琴的原型。

+0

當你說「你沒有在小提琴中包括原型」時,我不確定你的意思,而這可能是真正的問題。提出的解決方案也沒有工作,這進一步加強了我的想法,即原型是問題。 –

+0

我的歉意! *解決方案*工作。我現在得到的錯誤非常相似,但不完全相同,這使我感到困惑。感謝您的幫助! –

+1

它的作品,這可以幫助你瞭解http:// jsfiddle。net/timgreen/3rTmG/2/ –

3

當你通過循環的strokes成員,你所得到的鑰匙01"remove"。當您使用第三個鍵時,您會得到strokes["remove"](與strokes.remove相同),它將返回您添加到數組原型的remove方法,並且會出現該錯誤。

循環遍歷數組,而不是數組成員的索引:

for (var i = 0; i < strokes.length; i++) { 
    strokes[i].shift(.05); 
}