我认为问题不在于underscore.js,而在于Native原型函数。似乎只能直接调用它们,而不是将它们作为回调传递。这是我不能使用的代码和我的测试中的错误(使用Mocha.js,只有相关部分):
_.chain("INPUT").tap(String.prototype.toLowerCase)
// => TypeError: String.prototype.toLowerCase called on null or undefined
在Node的REPL中试过这个:
String.prototype.toLowerCase("INPUT")
// => ''
我知道应该使用.call
或.apply
调用原型函数,但为什么呢?我怎样才能将此函数作为回调函数传递?
答案 0 :(得分:2)
原型方法在内部使用this
来引用应该被操纵的对象。
call
和apply
可让您在调用函数时指定this
值。
String.prototype.toLowerCase.call('INPUT'); //input
如果要将this
值绑定到函数以使其调用形式无关紧要,可以使用_.bind
或Function.prototype.bind
执行此操作。
var lowerCaseInput = String.prototype.toLowerCase.bind('INPUT');
lowerCaseInput(); //input
现在,在对象上调用_.chain
会将其包装在下划线对象中并返回包装器,_.tap
将输入链中前一个函数的结果。在这里,我们发现它不起作用,因为String.prototype.toLowerCase
甚至不期望参数。
不仅如此,字符串也是不可变的,因此您必须执行以下操作:
_.chain({ text: 'INPUT' }).tap(function (obj) {
obj.text = obj.text.toLowerCase();
}).value().text;
答案 1 :(得分:0)
此外,如果您使用mixins,则可以使用简单包装mixin
的{{1}}。
toLowerCase
之后,您可以执行以下操作:
_.mixin({
toLowerCase: function(str) {
// Add here any desired validation if wanted
return str.toLowerCase();
}
}, {
chain: false
});