Javascript 为什么可以';带下划线的String.prototype.toLowerCase?

Javascript 为什么可以';带下划线的String.prototype.toLowerCase?,javascript,prototype,underscore.js,chaining,Javascript,Prototype,Underscore.js,Chaining,我认为问题不在于underline.js,而在于本机原型函数。似乎只能直接调用它们,而不能将它们作为回调传递。以下是我无法使用的代码和测试中的错误(使用Mocha.js,仅相关部分): 因此,在节点的REPL中尝试了以下操作: String.prototype.toLowerCase("INPUT") // => '' 我知道应该使用.call或.apply调用原型函数,但确切的原因是什么?如何将此函数作为回调传递?原型方法在内部使用this来引用应该被操作的对象 call和apply允

我认为问题不在于underline.js,而在于本机原型函数。似乎只能直接调用它们,而不能将它们作为回调传递。以下是我无法使用的代码和测试中的错误(使用Mocha.js,仅相关部分):

因此,在节点的REPL中尝试了以下操作:

String.prototype.toLowerCase("INPUT")
// => ''

我知道应该使用
.call
.apply
调用原型函数,但确切的原因是什么?如何将此函数作为回调传递?

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

call
apply
允许您在调用函数时指定

String.prototype.toLowerCase.call('INPUT'); //input
如果要将
值绑定到函数,使其调用形式无关紧要,则可以使用
\uu.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;

此外,如果使用mixin,则可以使用一个简单地将
包装为小写的
mixin

_.mixin({
    toLowerCase: function(str) {
        // Add here any desired validation if wanted
        return str.toLowerCase();
    }
}, {
    chain: false
});
之后,您可以执行以下操作:

_.chain('HELLO_WORLD')
    .toLowerCase()
    .replace('_',' ')
    .value()

非常感谢<代码>此
。。。我开始越来越不喜欢它了。我最终创建了一个简单的包装函数,如
函数小写(input){return input.toLowerCase();}
。在我看来,越简单,原型和对象就越少。太糟糕了,我们不能像其他常规函数一样传递原型函数。。。
_.chain('HELLO_WORLD')
    .toLowerCase()
    .replace('_',' ')
    .value()