2012-09-05 101 views
4

免责声明:(1)我的背景是Java/C#,我只是在上周开始深入研究JavaScript。 (2)我知道_.mixin()方法。JavaScript(Underscore.js)扩展功能

这不是项目的关键,而是我无法让我的周围对象继承头的Javascript。

例如,试图增加与_.keyFilter功能(我知道我可以用地图来实现类似的东西)返回其满足评价功能键的列表underscore.js。我可以实现与_.mixin()方法的结果:)

除了直接拖放功能到源代码,_.mixin(

_.mixin({ filterKey : function(obj, iterator, context) { 
    var results = []; 
    if (obj == null) return results; 
    _.each(obj, function(value, index, list) { 
     if (iterator.call(context, value, index, list)){ 
      results[results.length] = index; 
     } 
    }); 
    return results; 
}}); 

但是,我不知道我明白为什么我可以“T只是增加下划线,在我的脚本文件如下:

_.keyFilter = function(obj, iterator, context) { 
     var results = []; 
     if (obj == null) return results; 
     each(obj, function(value, index, list) { 
      if (iterator.call(context, value, index, list)) results[results.length] = index; 
     }); 
     return results; 
}; 

这样做,然后试图与调用它:

_.chain(myList).keyFilter(evalFunction); 

我得到以下异常:

'Uncaught TypeError: Object [object Object] has no method 'keyFilter' 

注意,那上面的方法做工作时,我将其放到underscore.js的源代码。

于是我尝试使用原型(我还没有完全掌握)回到我的脚本文件:

var keyFilter = _.prototype.keyFilter = function(obj, iterator, context) { 
     var results = []; 
     if (obj == null) return results; 
     each(obj, function(value, index, list) { 
      if (iterator.call(context, value, index, list)) results[results.length] = index; 
     }); 
     return results; 
}; 

但这抛出同样的异常。 (我认为下面的var正被加到脚本的顶部,这就是为什么我也尝试过这种做法,而且没有上面的传递任务)。

解释将不胜感激。

回答

3

这与其说是关于JavaScript比约下划线的问题,这往往做事我行我素的问题。

  • 只是通过添加它作为一个属性(即_.keyFilter = ...)是类似于添加一个静态方法来在Java类添加到_的方法。您正在将该方法添加到_对象,但它与_中的其余功能没有任何关系。这是添加新的实用方法合理的方式,但如果你想使用下划线的包装和链接功能。

  • 使用.mixin()让你挂接到下划线的包装和链接结构。这是特定于Underscore - 它不是JavaScript的一部分。除了编辑源代码,这是我所知道的,以便利用这些下划线功能,这在很大程度上依赖于下划线库中的私有方法和变量的唯一途径。

  • 虽然JS支持原型继承,并且每个对象都有一个prototype属性,但许多开发人员使用其他方法或其他类型的继承。这通常不是一个安全的假设,即增加一个方法的东西,看起来像一个构造函数将实际工作,除非你知道它背后的代码prototype。下划线确实为其包装对象使用原型继承,但以扭曲的,有点神奇的方式,我不认为向prototype添加方法会产生所需的效果 - 一方面,即使它工作,原型也只用于下划线包裹对象,所以_.keyFilter(...)绝对不行。

0

我想这是因为(前面已经说过)“_.keyFilter =”增加了一个方法到_对象,而是创建一个使用_(myList中)的undescore对象 - 这是链做什么 - 这是一个不同的对象。