【问题标题】:MooTools and Array prototypeMooTools 和 Array 原型
【发布时间】:2017-04-19 14:21:59
【问题描述】:

Mootools 覆盖了 Array 原型,问题是这个原型和我有一个使用 for(i in someArray) 迭代的外部 .js(我无法手动修改的库)并且它抛出异常,因为现在是 Array有更多的属性。关于如何克服这个问题的任何想法?我正在考虑从 Mootools 库本身的数组中删除这些属性,但这似乎并不容易。

【问题讨论】:

  • 如果你可以修改你正在使用的库,你应该在这些for循环中添加if (!someArray.hasOwnProperty(i)) continue;。见这里:stackoverflow.com/q/2040042/995958
  • for(i in someArray) if (someArray.hasOwnProperty(i)) {/* your code */}
  • 我知道这是一种不好的做法,但这是一个来自内置 SharePoint 的 javaScript 文件,它在 sp.ribbon.js 上定义得更具体。微软有人提出以这种方式迭代数组的想法。

标签: javascript arrays prototypejs mootools


【解决方案1】:

首先,您应该在数组上使用常规的for(var i=0; i < arr.length; i++) { var el = arr[i]; } 循环。

如果您确实需要for..in,并且您正在使用现代浏览器,那么您可以修改对原型的修改,使其不可枚举。

//Logger function
function logArray(arr) {
    console.log("--TEST-START--");
    for (var i in arr) {
      console.log(arr[i])
    }
    console.log("--TEST-END--");
  }
  //Modify prototype
Array.prototype.a = {
  b: 0
};
//List to test against
var list = [1, 2, 3, 4];
//Log initial list
logArray(list);
//Modify prototype modificiation
Object.defineProperty(Array.prototype, 'a', {
  enumerable: false
});

//Log initial list
logArray(list);

【讨论】:

  • 是的,这是正确的解决方案,但我希望 mootools 在向 Array.prototype() 添加新方法时首先这样做。
猜你喜欢
  • 1970-01-01
  • 2010-12-11
  • 1970-01-01
  • 1970-01-01
  • 2017-11-16
  • 1970-01-01
  • 2013-08-29
  • 1970-01-01
  • 2010-10-22
相关资源
最近更新 更多