Javascript - 原型函数名称作为关联数组的关键字返回

时间:2011-11-01 12:42:46

标签: javascript arrays prototype-programming

我想将一个原型函数添加到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似乎在内部定义它不会出现在对象/数组的键中(对吗?)。可以在运行时重现这种相同的行为吗?

5 个答案:

答案 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()