有没有一种简单的方法来消除mootools命名空间污染?

And*_*dru 6 javascript mootools prototypejs

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

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

不幸的是,MooTools(和Prototype等)将方法添加到全局命名空间,所以我的for ... in循环现在遍历MooTools的添加(例如,limit,round,times,each),当它将逻辑应用于它们时会导致错误如果是预期的数据.

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

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

谢谢 :)

nai*_*kus 4

如果您的客户端对象不是从其他自定义对象继承的,您可以看看是否可以使用 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];
  }
Run Code Online (Sandbox Code Playgroud)

如何使用它:

for(var key in someObj) {
  if(hasOwnProperty(someObj, key)) {
    // we are good to go!
  }
}
Run Code Online (Sandbox Code Playgroud)