2011-11-01 38 views
1

我想向javascript的数组对象添加原型函数。Javascript - 原型函数名称作为关联数组的键返回

我遇到的问题是,当我按下数组的键时,原型函数的名称出现在数组的键中。

下面是一个示例来说明问题:

<html> 
    <head> 
    <script type="text/javascript"> 
     Array.prototype.foo = function() { 
     // do something 
     } 
     function keys() { 
     var fruit = ["apples","pears","bannanas"]; 
     for (key in fruit) alert(key); // alerts: 0, 1, 2, foo 
     } 
    </script> 
    </head> 
    <body onload="keys();"> 
    </body> 
</html> 

我如何能解决这个得到任何想法?

我不要原型的功能,但从可读性的角度来看,我宁愿。

编辑:只要是明确的,现实世界中实现上面的例子中迭代通过关联数组,因此for..in循环

编辑:感谢您的答复球员,但我认为,你错过了我所追求的。我想知道的是,我是否可以将一个原型函数添加到javascript的数组对象中(或者以不同的方式声明具有相同效果的函数),而不必在通过一个for ..在循环中。以indexOf函数为例。 Javascript似乎在内部定义它,使得它不会出现在对象/数组的键中(对吗?)。运行时可以重现这种相同的行为吗?

+3

不要使用'for ... in'来遍历数组。使用普通的'for'循环,然后你就不会有这个问题。 –

+0

是的,除非它是一个关联数组 - 我不知道如何在不使用for..in循环的情况下遍历关联数组的方法.. –

+0

或者你可以做到,但检查类型不是函数 if(fruit [key] .constructor!= Function) – Marwan

回答

1

您需要检查循环中是否有fruit.hasOwnProperty(key)

+0

谢谢,那会派上用场 –

0

为了避免继承枚举的属性与for..in结合使用,使用hasOwnProperty测试:

for (var p in obj) { 
    if (obj.hasOwnProperty(p)) { 
    // p is a property of obj and not inherited 
    } 
} 

使用for..in与阵列不建议 - 如果你想要一个对象,必须使用对象。

通常在按顺序访问成员的地方使用数组,在循环中使用计数器。在返回属性的顺序中使用for..in依赖于实现,因浏览器而异,因此您不能保证顺序。

0

正如詹姆斯说,使用,而不是...

function keys() { 
    var fruit = ["apples", "pairs", "bananas"]; 
    for(var key in fruit) { 
    alert(key); 
    } 
} 

而是执行下列操作...

function keys() { 
    var fruit = ["apples", "pairs", "bananas"]; 
    for(var i = 0; i < fruit.length; ++i) { 
    alert(i); 
    } 
} 

由于length属性将只与索引数组项更新和不添加的项目到原型。

相关问题