javascript - 为什么我不能将 String.prototype.toLowerCase 与 underscore.js 链接起来?

标签 javascript prototype underscore.js chaining

我认为问题不在于 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 来引用应该被操作的对象。

callapply 允许您在调用函数时指定 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/

相关文章:

javascript - 在原型(prototype)的方法中搞砸这个

javascript - 具有多个谓词的过滤器,优雅的函数式方法

javascript - jquery如何返回被选元素的数组

javascript - 如何循环遍历每个文本框并将所有其他文本框中的文本框值设置为禁用(如果已输入)

javascript - AngularJS 中的 href 和 ng-click

javascript - 如何在 gridstack.js 中获取新的 y 值

原型(prototype)化为数组的 Javascript 对象成员被所有类实例共享

jquery - 使用 Twitter Bootstrap 进行基于网格和堆栈的布局

Node.js 和 Underscore.js

javascript - 如何从 kendo UI 操作表中获取所选项目?