原型 - var x = [] - 将函数添加到x上

时间:2012-07-16 14:49:48

标签: javascript jquery prototypejs

我是Prototype的新手,但我总是使用jQuery。我有一个网站,我需要使用jQuery和Prototype。我遇到以下代码问题:

var x = [];
console.log(x);
for (var l in x)
{
console.log(l);
}

运行此代码,x包含以下内容:


    each
    eachSlice
    all
    any
    collect
    detect
    findAll
    select
    grep
    include
    member
    inGroupsOf
    inject
    invoke
    max
    min
    partition
    pluck
    reject
    sortBy
    toArray
    entries
    zip
    size
    inspect
    find
    _reverse
    _each
    clear
    first
    last
    compact
    flatten
    without
    uniq
    intersect
    clone

预期结果(没有原型):

There are no child objects

为什么Prototype会这样做,以及如何阻止它?!

由于

3 个答案:

答案 0 :(得分:7)

您不应该对数组使用for...in,这正是原因。

for...in遍历对象的所有属性。这包括其属性(在本例中为数组索引)和添加到prototype的属性。

对于数组,只需使用普通的for循环。

var x = [];
console.log(x);
for(var i = 0, len = x.length; i<len; i++){
    console.log(i, x[i]);
}

注意:我执行var i = 0, len = x.length因为它只从数组中获取length一次,而不是每次迭代。 可能更快。

答案 1 :(得分:5)

您不应在数组上使用for..in,而应使用for( i=0; i<length; i++)。但除此之外:

for( l in x) {
    if( x.hasOwnProperty(l)) {
        // l is a property of your object
    }
}

这基本上忽略了循环的原型链。

答案 2 :(得分:0)

当您使用for ... in时,您将枚举数组的所有(可枚举的)属性,而不仅仅是数字索引。

由于Prototype.js向Array.prototype添加了许多新函数,并且未能将它们标记为不可枚举,因此这些函数也会出现在属性列表中。