Javascript 有没有一种简单的方法来消除污染?

Javascript 有没有一种简单的方法来消除污染?,javascript,mootools,prototypejs,Javascript,Mootools,Prototypejs,我开发的客户端javascript库在某些方面使用对象作为散列。它使用属性名作为键,使用for…in循环遍历从Json数据解析的对象。如。。。(伪代码) 不幸的是,MooTools(和Prototype等)将方法添加到全局名称空间中,因此我的for…in循环现在会迭代MooTools的添加(例如limit、round、times、each),当它将逻辑应用到这些方法时会导致错误,就好像它是预期的数据一样 由于它是一个库,我不得不期望它将与MooTools、Prototype等一起使用。有没有简单

我开发的客户端javascript库在某些方面使用对象作为散列。它使用属性名作为键,使用for…in循环遍历从Json数据解析的对象。如。。。(伪代码)

不幸的是,MooTools(和Prototype等)将方法添加到全局名称空间中,因此我的for…in循环现在会迭代MooTools的添加(例如limit、round、times、each),当它将逻辑应用到这些方法时会导致错误,就好像它是预期的数据一样

由于它是一个库,我不得不期望它将与MooTools、Prototype等一起使用。有没有简单的方法解决这个问题?我目前的解决方案只是将对象传递给一个方法,该方法去掉特定于MooTools的条目并返回干净的对象,但这意味着还要检查Prototype和所有类似的库添加了什么,这似乎是一种倒退的做法

我的另一个解决方案是停止依赖属性名作为键,并在循环中执行验证,以确保我正在查看想要查看的数据。在我重写之前,我想知道是否有人有更好的解决方案


谢谢:)

如果您的客户端对象不是从其他自定义对象继承的,那么您可以看看是否可以使用javascript的
Object.hasOwnProperty
方法来确定某个属性是否存在于对象本身中,而不是通过prototype对象在继承链中

对于不支持此方法的浏览器,您可以编写一个包装器来检查:

  var hasOwnProperty = function(object, property)   {
     if(object.hasOwnProperty)  {
        return object.hasOwnProperty(property);
     }
     var prop = object[property];
     return typeof(prop) !== "undefined" && prop !== 
             object.constructor.prototype[property];
  }
如何使用它:

for(var key in someObj) {
  if(hasOwnProperty(someObj, key)) {
    // we are good to go!
  }
}

如果我没有弄错的话,您正在寻找方法。

同时使用
MooTools
Prototype
不是一个好主意,因为它们修改了基础原型,不能和平共存。也就是说,它们都不会修改
Object.prototype
(不再是了),因此除了您自己的属性之外,您应该不会看到任何其他属性

您是否添加了一个插件,该插件可能正在添加这些属性?您能否给出一个更完整的示例,说明这些属性在哪里列出,以及您正在使用的这些库的版本

hasOwnProperty
检查将解决原型问题,但首先不需要这样做,因此最好查明到底是哪个脚本出错了

MooTools创建了一个类型,只是因为他们不想修改
Object.prototype
。以下是文档中的引用:

散列

一种自定义对象({})实现,在设置、获取或迭代时不考虑原型。非常有用,因为在JavaScript中,我们不能使用Object.prototype。相反,我们可以使用Hash.prototype

由于“limit”、“round”、“times”和“each”都是数组原型的附加方法,所以您的主要失败在于使用“for-in”来迭代数组。您应该先检查对象的类型,然后仅对对象使用“for in”,对数组使用“for”。
顺便说一句,“for in”是迭代数组最慢的方法

我不认为你会发现现在有太多浏览器没有
hasOwnProperty
方法,在IE上,它是在IE5.5(2000年7月发布!)上引入的。@CMS我一直认为IE6不支持它,感谢你指出所有这些都是
Number
上的附加方法,而不是
Array
。我想我们在这里看不到完整的例子,因为枚举一个数字与OP所显示的相差甚远。好的,舍入和限制来自numer,其他的来自数组。用“for in”在我不知道的对象上迭代是个坏主意。
for(var key in someObj) {
  if(hasOwnProperty(someObj, key)) {
    // we are good to go!
  }
}