我认为问题不在于 underscore.js,而在于原生原型(prototype)函数。似乎只能直接调用它们,不能将它们作为回调传递。这是我无法使用的代码和我的测试错误(使用 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
调用原型(prototype)的函数,但究竟为什么呢?以及如何将此函数作为回调传递?
最佳答案
原型(prototype)方法在内部使用 this
来引用应该被操作的对象。
call
和 apply
允许您在调用函数时指定 this
值。
String.prototype.toLowerCase.call('INPUT'); //input
如果你想将一个 this
值绑定(bind)到一个函数,这样它的调用形式就无关紧要了,你可以使用 _.bind
或 函数.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;
关于javascript - 为什么我不能将 String.prototype.toLowerCase 与 underscore.js 链接起来?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19517208/