【问题标题】:Javascript - Prototyped Function Name Returned As A Key Of Associative ArrayJavascript - 作为关联数组的键返回的原型函数名称
【发布时间】:2011-11-01 12:42:45
【问题描述】:

我想向 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 似乎在内部以这样的方式定义它,即它不会出现在对象/数组的键中(对吗?)。可以在运行时重现相同的行为吗?

【问题讨论】:

  • 不要使用for...in 来遍历数组。使用普通的for 循环就不会出现这个问题了。
  • 是的,除非它是一个关联数组——我不知道在不使用 for..in 循环的情况下迭代关联数组的方法..
  • 或者你可以这样做,但检查类型不是函数 if (fruit[key].constructor != Function)
  • 您应该更新您的示例以显示这一点。
  • javascript 中没有“关联数组”。有对象和数组。数组只是具有特殊长度属性和一些方便方法的对象。对象只是名称/值对的无序捆绑。

标签: javascript arrays prototype-programming


【解决方案1】:

你需要检查fruit.hasOwnProperty(key)是否在循环中。

【讨论】:

  • 谢谢,这会派上用场
【解决方案2】:

为避免使用 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 属性返回的顺序取决于实现,并且因浏览器而异,因此您不能保证顺序。

【讨论】:

    【解决方案3】:

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

    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);
      }
    }
    

    因为长度属性只会更新索引数组项,而不是添加到原型中的项。

    【讨论】:

      【解决方案4】:

      要使用 for in 遍历关联数组并获得您想要的内容,我将使用 typeof 对适当性进行类型检查并限制为非函数。您可以使用 number, string, boolean, object, 功能 和undefined 用 typeof http://msdn.microsoft.com/en-us/library/259s7zc1%28v=vs.94%29.aspx

      【讨论】:

        【解决方案5】:

        我很欣赏它并不总是可用,但您可以通过使用 Array#forEach 来避免整个混乱,或者如果您正在使用 JavaScript 库(很有可能并且强烈推荐),那么您有类似 Prototype 的 Enumerable#each()、Sugar 的Array#each() 或 jQuery 的 $.each()

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2013-10-14
          • 1970-01-01
          • 2013-05-12
          • 1970-01-01
          • 1970-01-01
          • 2011-03-02
          • 1970-01-01
          相关资源
          最近更新 更多