代码之家  ›  专栏  ›  技术社区  ›  Andru

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

  •  6
  • Andru  · 技术社区  · 14 年前

    var conversations = {'sha1-string':{name:'foo',messages:[]}}
    for(var id in conversations){
        console.log(id);
        console.log(conversations[id].name);
    }
    

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

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

    谢谢:)

    4 回复  |  直到 13 年前
        1
  •  4
  •   naikus    14 年前

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

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

      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!
      }
    }
    
        2
  •  0
  •   Álvaro González    14 年前
        3
  •  0
  •   Andreas Köberle    14 年前

    顺便说一句,“for in”是遍历数组最慢的方法。

        4
  •  0
  •   Community alpakyol    4 年前

    MooTools Prototype 这不是一个好主意,因为他们修改了基础原型,不能和平共处。也就是说,他们都没有修改 Object.prototype (不再)所以你应该 除了你自己的房子以外,还有别的房子吗。

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

    hasOwnProperty

    MooTools创建了一个 Hash 只是因为他们不想修改 . 以下是文件中的引用:

    搞砸

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