JavaScript(Underscore.js)扩展功能

Rob*_*erc 5 javascript underscore.js

免责声明:(1)我的背景是Java/C#,我上周才开始深入研究JavaScript.(2)我知道_.mixin()方法.

这不是项目关键,而是我无法在Javascript中了解对象继承.

例如,尝试使用_.keyFilter函数(我意识到我可以使用map来实现类似的东西)来扩充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;
}});
Run Code Online (Sandbox Code Playgroud)

但是,我不确定为什么我不能简单地在我的脚本文件中使用以下内容来增加下划线:

_.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;
};
Run Code Online (Sandbox Code Playgroud)

这样做,然后尝试调用它:

_.chain(myList).keyFilter(evalFunction);
Run Code Online (Sandbox Code Playgroud)

我得到以下异常:

'Uncaught TypeError: Object [object Object] has no method 'keyFilter' 
Run Code Online (Sandbox Code Playgroud)

注意,当我将它放入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;
};
Run Code Online (Sandbox Code Playgroud)

但这引发了同样的例外.(我认为下面的var被提升到了剧本的顶部,这就是为什么我也尝试了这个以及上面的传递分配).

非常感谢解释.

nra*_*itz 4

这与其说是关于 JavaScript 的问题,不如说是关于 Underscore 的问题,Underscore 往往以自己的方式做事。

  • 仅通过将方法添加_为属性(即_.keyFilter = ...)来添加方法类似于在 Java 中向类添加静态方法。您正在向对象添加该方法_,但它与_. 这是添加新实用方法的合理方法,但如果您想使用 Underscore 的包装和链接功能,则不然。

  • 使用.mixin()允许您连接到 Underscore 的包装和链接架构。这是 Underscore 特有的 - 它不是 JavaScript 的一部分。除了编辑源代码之外,这是我所知道的利用这些 Underscore 功能的唯一方法,这些功能很大程度上依赖于 Underscore 库中的私有方法和变量。

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