1. ホーム
  2. javascript

[解決済み] Underscore.jsの_.bindAll()関数の解説が必要です。

2023-06-19 21:53:20

質問

私はbackbone.jsをいくつか学んでいて、たくさんの例を見てきました。 _.bindAll() が使われている例をたくさん見ました。私はbackbone.jsとunderscore.jsのドキュメントページを全部読んで、それが何をするものなのかを理解しようとしましたが、まだ非常に曖昧なままです。以下、underscoreの説明です。

_.bindAll(object, [*methodNames]) 

オブジェクトのいくつかのメソッドを メソッド名で指定された、そのオブジェクトの そのオブジェクトのコンテキストで実行されるように で実行されるようにします。非常に便利です。 イベントハンドラとして使用される関数のバインドに イベントハンドラとして使用されるバインディング関数に非常に便利です。 で呼び出されます。 で呼び出されることになります。もし、methodNames を指定しない場合、オブジェクトのすべての の関数プロパティが結合されます。 にバインドされます。

var buttonView = {
  label   : 'underscore',
  onClick : function(){ alert('clicked: ' + this.label); },
  onHover : function(){ console.log('hovering: ' + this.label); }
};

_.bindAll(buttonView);

jQuery('#underscore_button').bind('click', buttonView.onClick);
=> When the button is clicked, this.label will have the correct value...

もしあなたが別の例や口頭での説明を与えることによって、ここを助けることができるなら、何でもありがたいことです。より多くのチュートリアルや例を検索しようとしましたが、私が必要とするものを提供するものは見つかりませんでした。ほとんどの人は、それが自動的に行うことを知っているだけのようです。

どのように解決するのですか?

var Cow = function(name) {
    this.name = name;
}
Cow.prototype.moo = function() {
    document.getElementById('output').innerHTML += this.name + ' moos' + '<br>';
}

var cow1 = new Cow('alice');
var cow2 = new Cow('bob');

cow1.moo(); // alice moos
cow2.moo(); // bob moos

var func = cow1.moo;
func(); // not what you expect since the function is called with this===window
_.bindAll(cow1, 'moo');
func = cow1.moo;
func(); // alice moos
<div id="output" />
<script src="https://cdnjs.cloudflare.com/ajax/libs/underscore.js/1.8.3/underscore-min.js"></script>

残念ながら、実際の "bind all" 機能はオブジェクトの右側の関数に対してのみ機能します。プロトタイプ上で定義された関数をインクルードするには、それらの関数名を明示的に追加の引数として _.bindAll() .

とにかく、あなたは説明を求めていました。基本的には、オブジェクト上の関数を、同じ名前と振る舞いを持ち、かつそのオブジェクトにバインドされている関数に置き換えることができます。 this === theObject メソッドとして呼び出さなくとも ( theObject.method() ).