Prototypejs与Underscore相冲突

时间:2012-08-01 08:14:12

标签: javascript prototypejs underscore.js

编辑:

我把它放在首位,因为我终于找到了实际问题。

Prototypejs正在添加一个与下划线相关的Array.reduce函数(参见:https://github.com/documentcloud/underscore/issues/7

除了“使用原型> 1.6.1”之外,这里似乎没有任何结论但是我无法控制不幸使用的原型。除了改变_.reduce方法而不使用原生函数或代理使用reduce的任何方法(请参阅注释)我看不出任何解决此问题的好方法。


我遇到的问题是Prototypejs被包含在与我的javascript“app”相同的页面上,我使用下划线。

似乎每当我尝试使用函数_.unique时,它实际上是调用原型函数,这是在一个闭包中,我使用requirejs加载_。当我改变所包含的库的顺序,所以我的应用程序包含在原型之前,然后一切正常,不幸的是我无法使用它作为解决方案,因为我无法控制它如何包含在任何页面中。

我想知道是否有人之前遇到过这个问题并且有一个可能的解决方案,其中_.unique将始终调用下划线函数而不是任何称为unique的全局原型函数。

由于

编辑:

我实际上认为我实际上被覆盖的唯一方法可能是错的。我刚刚在下划线函数中添加了一些控制台日志,它似乎被调用但是它返回空:

_.uniq = _.unique = function(array, isSorted, iterator) {
      console.log("called this");
      console.log(array);
    var initial = iterator ? _.map(array, iterator) : array;
    var results = [];
    // The `isSorted` flag is irrelevant if the array only contains two elements.
    if (array.length < 3) isSorted = true;
    _.reduce(initial, function (memo, value, index) {
        console.log("it never gets here");
      if (isSorted ? _.last(memo) !== value || !memo.length : !_.include(memo, value)) {
        memo.push(value);
        results.push(array[index]);
      }
      return memo;
    }, []);
      console.log(results);
    return results;
  };

第一个控制台日志给我“[1,2,3,1]”,而第二个给我“[]”。只有当原型包含在页面上时才会发生这种情况,因此会发生一些事情。

我添加了另一个永远执行的日志(它永远不会到达此处)。看起来下划线正在执行“原生”reduce方法,这是Prototypejs提供的方法,它不会占用迭代器。

1 个答案:

答案 0 :(得分:0)

是的,Prototype.js会覆盖reduce,这真是一个坏主意。如果reduce是Prototype.js搞砸的唯一内容,那么如何在Array.prototype.reduce开始时将null设置为_.uniq?似乎_.intersection_.union都依赖于_.uniq

 _.uniq = _.unique = function(array, isSorted, iterator) {
     var keepIt = Array.prototype.reduce;
     Array.prototype.reduce = null;
     //....
     Array.prototype.reduce = keepIt;
 };