为什么我不能使用underscore.js链接String.prototype.toLowerCase?

时间:2013-10-22 11:57:34

标签: javascript prototype underscore.js chaining

我认为问题不在于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调用原型函数,但为什么呢?我怎样才能将此函数作为回调函数传递?

2 个答案:

答案 0 :(得分:2)

原型方法在内部使用this来引用应该被操纵的对象。

callapply可让您在调用函数时指定this值。

String.prototype.toLowerCase.call('INPUT'); //input

如果要将this值绑定到函数以使其调用形式无关紧要,可以使用_.bindFunction.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
});