免责声明:(1)我的背景是Java / C#,我上周才开始深入研究JavaScript. (2)我知道_.mixin()方法.
这不是项目关键,而是我无法在Javascript中了解对象继承.
例如,尝试使用_.keyFilter函数(我意识到我可以使用map来实现类似的东西)来扩充underscore.js,以返回满足评估函数的键列表.我可以用_.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,list)){
results[results.length] = index;
}
});
return results;
}});
但是,我不确定为什么我不能简单地在我的脚本文件中使用以下内容来增加下划线:
_.keyFilter = function(obj,context) {
var results = [];
if (obj == null) return results;
each(obj,list) {
if (iterator.call(context,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,list)) results[results.length] = index;
});
return results;
};
但这引发了同样的例外. (我认为下面的var被提升到了剧本的顶部,这就是为什么我也尝试了这个以及上面的传递分配).
非常感谢解释.
>只需将方法作为属性添加到_(即_.keyFilter = …)类似于向Java中的类添加静态方法.您正在将方法添加到_对象,但它与_中的其余功能没有关系.这是添加新实用程序方法的合理方法,但如果您想使用Underscore的包装和链接功能则不行.
>使用.mixin()可以挂钩Underscore的包装和链接架构.这是Underscore特有的 – 它不是JavaScript的一部分.除了编辑源代码之外,这是我意识到利用这些Underscore功能的唯一方法,这些功能主要依赖于Underscore库中的私有方法和变量.
>虽然JS支持原型继承,并且每个对象都有一个prototype属性,但许多开发人员使用其他方法或其他类型的继承.通常不能安全地假设将一个方法添加到看起来像构造函数的东西的原型实际上会起作用,除非你知道它背后的代码. Underscore确实为其包装对象使用了原型继承,但是以一种扭曲的,有点神奇的方式,我不认为添加原型的方法会产生预期的效果 – 首先,即使它起作用,原型也仅用于包裹对象的下划线,所以_.keyFilter(…)绝对不行.