【问题标题】:Stopping enumeration in JavaScript when using prototype使用原型时停止 JavaScript 中的枚举
【发布时间】:2012-02-11 07:15:33
【问题描述】:

我目前正在尝试在 JavaScript 中使用原型。

为了试验这一点,我编写了一个函数,它可以有效地将 where 子句放到数组中:

Array.prototype.where=(function(){
  var tmpArr=[],
      success;

  for (var x in this){
    var success=true;
    for (var i in arguments){
      if (this[x][arguments[i][0]]!=arguments[i][1]){
        success=false;
        break;
      }
    }

    if (success==true){
      tmpArr.push(this[x]);
    }
  }
  return tmpArr;
});

一个例子是:

arrayName.where([0, 'Fred'], [1, 'Bloggs']);

为了测试,这很好用。唯一的问题是如果你要运行

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

你得到了数组的输出,但是记录代表你原型化的函数。

据我所知,这是通过将函数设置为不可枚举来排序的,但我找不到任何解释如何停止它的文章。

我会怎么做呢?还是我每次都必须执行以下操作?

for (var x in someArray){
  if (typeof tSch[x]!="object"){
  }
}

【问题讨论】:

    标签: javascript prototype enumerable


    【解决方案1】:

    for...in 构造枚举对象的所有属性(以及沿原型链继承的属性)。当您将它与数组一起使用时,它将遍历 Array.prototype 的所有属性以及数组的元素。

    使用普通的for 循环来防止这种情况:

    for(var x = 0; x < this.length; x++) {
        //Do stuff
    }
    

    【讨论】:

    • 好吧,真可惜=[谢谢!
    • 没问题。请注意,您可以使用 Object.hasOwnProperty 解决此问题,如其他几个答案中所述。我没有提到这一点的原因是这是非常糟糕的做法。您可能不应该将 for...in 与原生对象一起使用!
    • 另一种可能的解决方案是在可用的情况下使用本机 Array.prototype.forEach 方法,如果没有,则使用 shim:github.com/kriskowal/es5-shim
    【解决方案2】:

    一般来说,你不应该乱用原生对象的原型。这会导致问题——尤其是与外部代码/库结合使用时。

    相反,您应该将其设为对数组参数进行操作的函数(例如 function arrayWhere(arr))。

    如果您想坚持扩展本机原型,您应该使用 forEach 方法(较新的浏览器,可能添加回退,如 MDN 中所述)或对象的 hasOwnProperty 方法,如所述in this example.

    【讨论】:

      【解决方案3】:

      一般来说,使用for ... in 循环遍历数组是不好的做法。

      但是,一个简单的解决方法是使用Object.hasOwnProperty

      for (var x in someArray) {
        if (someArray.hasOwnProperty(x)) {
          //...
        }
      }
      

      这是一种比您的循环更强大的方法。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-11-12
        • 2011-03-22
        • 1970-01-01
        • 1970-01-01
        • 2014-01-16
        • 1970-01-01
        • 1970-01-01
        • 2012-03-20
        相关资源
        最近更新 更多