2012-11-07 45 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); 
}