免責事項: (1) 私のバックグラウンドは Java/C# で、先週 JavaScript を深く掘り下げ始めたばかりです。(2) _.mixin() メソッドについては知っています。
これはプロジェクト クリティカルではありませんが、Javascript でのオブジェクトの継承について頭を悩ませています。
たとえば、評価関数を満たすキーのリストを返すために、underscore.js を _.keyFilter 関数で拡張しようとしました (map を使用して同様のことを実現できることに気付きました)。_.mixin() メソッドで結果を得ることができます:
関数をソースコードに直接ドロップする以外に、_.mixin()
_.mixin({ filterKey : function(obj, iterator, context) {
var results = [];
if (obj == null) return results;
_.each(obj, function(value, index, list) {
if (iterator.call(context, value, index, list)){
results[results.length] = index;
}
});
return results;
}});
ただし、スクリプトファイルで次のようにアンダースコアを単純に拡張できない理由を理解しているかどうかはわかりません。
_.keyFilter = function(obj, iterator, context) {
var results = [];
if (obj == null) return results;
each(obj, function(value, index, list) {
if (iterator.call(context, value, index, list)) results[results.length] = index;
});
return results;
};
これを行ってから、次のように呼び出してみました:
_.chain(myList).keyFilter(evalFunction);
次の例外が発生します。
'Uncaught TypeError: Object [object Object] has no method 'keyFilter'
上記の方法は、underscore.js のソース コードにドロップすると機能することに注意してください。
それで、スクリプトファイルでプロトタイプ(まだ完全には把握していません)を使用してみました:
var keyFilter = _.prototype.keyFilter = function(obj, iterator, context) {
var results = [];
if (obj == null) return results;
each(obj, function(value, index, list) {
if (iterator.call(context, value, index, list)) results[results.length] = index;
});
return results;
};
しかし、これは同じ例外をスローしました。(下の var がスクリプトの一番上までハイキングされていると思ったので、上記の推移的な割り当ての有無にかかわらずこれを試しました)。
説明をいただければ幸いです。