我想将一个原型函数添加到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迭代数组时调高函数名称..in循环。以indexOf
函数为例。 Javascript似乎在内部定义它不会出现在对象/数组的键中(对吗?)。可以在运行时重现这种相同的行为吗?
答案 0 :(得分:1)
您需要检查循环中是否fruit.hasOwnProperty(key)
。
答案 1 :(得分:0)
要避免使用for..in继承的可枚举属性,请使用hasOwnProperty测试:
for (var p in obj) {
if (obj.hasOwnProperty(p)) {
// p is a property of obj and not inherited
}
}
不建议在数组中使用for..in - 如果需要对象,请使用Object。
通常在按顺序访问成员的地方使用数组,例如在循环中使用计数器。使用for..in返回属性的顺序取决于实现,并且在浏览器之间有所不同,因此您无法保证顺序。
答案 2 :(得分: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属性只会使用索引数组项进行更新,而不会添加到原型中。
答案 3 :(得分:0)
要通过in in关联数组并获得你想要的东西,我将使用typeof
来检查适当性并限制为非函数。您可以使用
number
,
string
,
boolean
,
object
,
功能
和undefined
与typeof
http://msdn.microsoft.com/en-us/library/259s7zc1%28v=vs.94%29.aspx
答案 4 :(得分:-1)
我很感激它并不总是可用,但你可以通过使用Array#forEach
来避免整个混乱,或者如果你使用的是JavaScript库(非常可能并且强烈推荐)那么你就有了类似Prototype的{{3 },Sugar的Enumerable#each()
或jQuery的Array#each()
。