1

問題は underscore.js ではなく、ネイティブ プロトタイプ関数にあると思います。それらをコールバックとして渡すのではなく、直接呼び出すことしかできないようです。使用できないコードとテストのエラー (Mocha.js を使用し、関連する部分のみ) は次のとおりです。

_.chain("INPUT").tap(String.prototype.toLowerCase)
// => TypeError: String.prototype.toLowerCase called on null or undefined

Nodeの REPL でこれを試しました:

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

プロトタイプの関数を.callor.applyで呼び出さなければならないことはわかっていますが、なぜ正確に ? そして、この関数をコールバックとして渡すにはどうすればよいですか?

4

2 に答える 2

2

プロトタイプ メソッドはthis、操作する必要があるオブジェクトを参照するために内部的に使用しています。

call関数を呼び出すときapplyに値を指定できます。this

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

this呼び出し形式が問題にならないように値を関数にバインドする場合は、 _.bindorを使用して実行できます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;
于 2013-10-22T12:22:58.633 に答える
0

さらに、ミックスインを使用する場合はmixin、単純にラップする a を使用できますtoLowerCase

_.mixin({
    toLowerCase: function(str) {
        // Add here any desired validation if wanted
        return str.toLowerCase();
    }
}, {
    chain: false
});

その後、次のようなことができます:

_.chain('HELLO_WORLD')
    .toLowerCase()
    .replace('_',' ')
    .value()
于 2016-08-18T19:18:05.337 に答える