5

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

这不是项目关键,而是我无法理解 Javascript 中的对象继承。

例如,尝试使用 _.keyFilter 函数来增加 underscore.js(我意识到我可以使用 map 来实现类似的功能)以返回满足评估函数的键列表。我可以使用 _.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;
}});

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

_.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 被提升到脚本的顶部,这就是为什么我也尝试使用和不使用上面的传递赋值)。

解释将不胜感激。

4

2 回答 2

4

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

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

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

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

于 2012-09-06T00:25:20.540 回答
0

我认为这是因为(如前所述)“_.keyFilter =”向 _ 对象添加了一个方法,但使用 _(myList) 创建了一个 undescore 对象——这就是链所做的——这是一个不同的对象。

于 2013-03-02T21:01:15.757 回答