使用原型时停止JavaScript中的枚举
Stopping enumeration in JavaScript when using prototype
我目前正在尝试在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
方法(如本例中所述)迭代数组。
相关文章:
- 如何发送分配列表<字符串>到JavaScript数组或可枚举对象
- JavaScript数组的子类化破坏了快速枚举
- 为什么Javascript程序员更喜欢在代码中重复字符串作为常量,而不是使用枚举类型的对象
- 如何从 Javascript 访问 Java 枚举 (Java 1.8)
- Javascript propertyIsNumerable-是否有可枚举的方法
- Javascript不可枚举属性
- TypeScript 中的枚举:JavaScript 代码在做什么
- 如何更改 Javascript 对象属性的可写可枚举和可配置值
- JavaScript for.in 和枚举奇怪的行为
- javascript 是否保证枚举同一对象两次将以相同的顺序遍历字段
- 无法在 javascript 中枚举对象的所有属性
- Javascript:枚举全局变量
- 如何将 Typescript 枚举的值添加到我的 JavaScript 函数中
- 具有 IDE 完成功能的 Javascript 伪枚举
- Javascript中的枚举
- JavaScript枚举对象-使用字符串或数字的速度更快
- Javascript枚举对象值:obj.key与obj[key]的区别
- JavaScript-枚举嵌套对象结构
- 如何用javascript枚举文档中的所有html id's ?
- 搜索javascript枚举