是否可以取消注册Javascript原型扩展

时间:2010-01-04 14:30:02

标签: javascript prototype

据我所知,使用for..in循环迭代Array并不是推荐的迭代方法。但我很想知道是否有办法取消注册这些扩展。我使用过Groovy,在Groovy的情况下,有一个注册表可以在运行时被操作以擦除通过元类指定的其他条目。

我目前的用例是Prototype正在为Array原型添加扩展。由于我使用了大量基于jQuery的插件(我使用jQuery),我必须测试网站的大部分功能,以确保一切正常。这太令人生畏了。至于为什么我应该使用Prototype和jQuery,那么就这么说吧,我现在没有任何选择。

我也理解,取消注册(如果可能)这些扩展绝不是所有代码协调存在的解决方案,因为它意味着对现有实例和新实例的破坏性更改。会有许多匿名函数依赖于这些扩展并且稍后会失败。我很想知道javascript实现和对底层逻辑的可能访问。

由于 拉姆

4 个答案:

答案 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 */
    }
}