【问题标题】:Is there an easy way to remove mootools namespace pollution?有没有一种简单的方法可以消除 mootools 命名空间污染?
【发布时间】:2011-03-20 18:51:47
【问题描述】:

我开发的客户端 JavaScript 库在某些区域使用对象作为哈希值。它通过使用属性名称作为键的 for...in 循环遍历从 Json 数据解析的对象。例如...(伪代码)

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 的添加(例如限制、回合、时间、每个),在应用逻辑时会导致错误对他们来说,就好像这是预期的数据。

因为它是一个库,我不得不期待它会与 MooTools、Prototype 等一起使用。有没有简单的方法解决这个问题?我目前的解决方案只是将对象传递给一个方法,该方法去除 MooTools 特定条目并返回干净的对象,但这也意味着检查 Prototype 和所有类似库添加的内容,并且似乎是一种倒退的做事方式.

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

谢谢:)

【问题讨论】:

    标签: javascript mootools prototypejs


    【解决方案1】:

    如果您的客户端对象不是从其他自定义对象继承的,您可以查看是否可以使用 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!
      }
    }
    

    【讨论】:

    • 我想现在你不会发现太多没有hasOwnProperty方法的浏览器,在IE上,它是在IE5.5上引入的(2000年7月发布!)...跨度>
    • @CMS 我一直以为IE6不支持,谢谢指出
    【解决方案2】:

    如果我没听错,你正在寻找hasOwnProperty() 方法。

    【讨论】:

      【解决方案3】:

      由于“limit”、“round”、“times”和“each”都是 Array 原型的附加方法,因此您的主要失败是使用“for in”来迭代数组。您应该在之前检查对象的类型,并仅对对象使用“for in”,对数组使用“for”。 顺便提一句。 “for in”是遍历数组的最慢方法。

      【讨论】:

      • 所有这些都是Number 上的附加方法,而不是Array。我认为我们在这里看不到完整的示例,因为枚举一个数字远不及 OP 所显示的。
      • OK 回合和限制来自 numer,其他来自数组。用“for in”遍历我不知道的对象是个坏主意。
      【解决方案4】:

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

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

      hasOwnProperty 检查将解决原型问题,但首先这不应该是必需的,所以最好找出到底是哪个脚本搞砸了。

      MooTools 创建了一个Hash 类型只是因为他们不想修改Object.prototype。这是来自文档的引述:

      哈希

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-03-23
        • 1970-01-01
        • 1970-01-01
        • 2016-09-24
        • 2011-06-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多