_.bindAll
1.4.4は、メソッド名を指定せずに (正常に) 呼び出すことができるUnderscore の最後のバージョンであるため、1.4.4 を見ていきます。
_.bindAll
実装は非常にシンプルで、レビューすると問題が解決するはずです。
_.bindAll = function(obj) {
var funcs = slice.call(arguments, 1);
if (funcs.length === 0) funcs = _.functions(obj);
each(funcs, function(f) { obj[f] = _.bind(obj[f], obj); });
return obj;
};
3 行目が重要です。
funcs = _.functions(obj);
したがって、バインドする関数を指定しない場合、Underscore は関数であるすべてのオブジェクトのプロパティを取得し、それらすべてをバインドします。詳細については、_.functions
実装とドキュメントを確認してください。
しかし、constructor
プロパティは何ですか?さて、それは:
... インスタンスのプロトタイプを作成した Object 関数への参照
これは_.isFunction
テストに合格し、上記の配列にconstructor
なります。funcs
つまり、次constructor
の 4 行目のラッパー関数に置き換えられます_.bindAll
。
obj[f] = _.bind(obj[f], obj);
しかし、そのラッパー関数には、元の関数が持つプロパティ ( などparse
)がまったくなくproject.constructor
、すべてが混乱とナンセンスの山にバラバラになります。
この種の混乱は、おそらく 1.5+_.bindAll
が言う理由です:
bindAll _.bindAll(object, *methodNames)
[...] methodNamesは必須です。
オブジェクトのプロパティを反復処理して、どれが関数でどれがそうでないかを判断しようとすると、他の奇妙な問題に遭遇することもあります。
予期せぬ事態が発生した場合は、Underscore と Backbone のソースを参照することをお勧めします。どちらも非常に読みやすく、理解しやすいものです。