据我所知,使用for..in循环迭代Array并不是推荐的迭代方法。但我很想知道是否有办法取消注册这些扩展。我使用过Groovy,在Groovy的情况下,有一个注册表可以在运行时被操作以擦除通过元类指定的其他条目。
我目前的用例是Prototype正在为Array原型添加扩展。由于我使用了大量基于jQuery的插件(我使用jQuery),我必须测试网站的大部分功能,以确保一切正常。这太令人生畏了。至于为什么我应该使用Prototype和jQuery,那么就这么说吧,我现在没有任何选择。
我也理解,取消注册(如果可能)这些扩展绝不是所有代码协调存在的解决方案,因为它意味着对现有实例和新实例的破坏性更改。会有许多匿名函数依赖于这些扩展并且稍后会失败。我很想知道javascript实现和对底层逻辑的可能访问。
由于 拉姆
答案 0 :(得分:2)
for循环的问题是一些libs(原型)向基础对象添加属性,并导致它们被for循环枚举。
以下循环将遍历添加到基础的所有自定义属性 对象并从原型中删除它们,使得使用“for in”数组
是安全的for (var prop in {}) {
delete Object.prototype[prop]
}
然而,正如您所提到的,这将破坏原型本身。如果使用原型,则应使用其中一种迭代方法。但我不明白你试图解决的问题,所以我只是解释了如何撤消原型所做的事情。
答案 1 :(得分:0)
for ... in
是该语言的一部分。您无法更改现有实施,但您可以随时编写自己的实施!
答案 2 :(得分:0)
如果您有“foo.bar()”,则可以执行“delete foo.bar;”这将删除“方法”(属性)。 Dunno,如果它适用于原型继承的东西,但它值得一试。
答案 3 :(得分:0)
您可以使用Object.hasOwnProperty来确定您通过迭代查看的属性是属于数组本身还是其原型。如果它来自原型,您可以在此时决定是删除它还是忽略它:
for property in myarray {
if (myarray.hasOwnProperty(property)) {
do_something_useful();
}
}
或
for property in myarray {
if (!myarray.hasOwnProperty(property)) {
myarray[property] = null;
/* or delete myarray.prototype[property] */
/* or recursively search through prototype chain to
find the source of property, and delete it there */
}
}