使用原型时停止JavaScript中的枚举

Stopping enumeration in JavaScript when using prototype

本文关键字:JavaScript 枚举 原型      更新时间:2023-09-26

我目前正在尝试在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"){
  }
}

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

使用正常的for循环来防止这种情况:

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

通常,使用for ... in循环迭代数组是不好的做法。

然而,一个简单的修复方法是使用Object.hasOwnProperty:

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

这是一种比循环更健壮的方法。

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

相反,您应该使它成为一个对数组参数(例如function arrayWhere(arr))进行操作的函数。

如果您想坚持扩展本机原型,您应该使用forEach方法(较新的浏览器,可能会添加MDN中描述的回退)或对象的hasOwnProperty方法(如本例中所述)迭代数组。