JavaScript(Underscore.js)扩展功能

JavaScript (Underscore.js) Extending functionality

本文关键字:扩展 功能 js Underscore JavaScript      更新时间:2023-09-26

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

这不是项目关键,但我很难理解Javascript中的对象继承。

例如,我尝试用_.keyFilter函数来扩充undercore.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' 

注意,当我将上面的方法放入undercore.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被提升到了脚本的顶部,这就是为什么我也尝试了使用和不使用上面的传递赋值)。

如有解释,不胜感激。

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

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

  • 使用.mixin()可以挂接Underscore的包装和链接体系结构。这是Underscore特有的——它不是JavaScript的一部分。除了编辑源代码,这是我所知道的利用这些Undercore功能的唯一方法,这些功能在很大程度上依赖于Undercore库中的私有方法和变量。

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

我认为这是因为(如前所述)"_.keyFilter="向_对象添加了一个方法,但使用_(myList)创建了一个不需要的对象——这就是chain的作用——这是一个不同的对象。