1

このコードは、javascript のコンストラクター関数本体の一部です。

window.addEventListener("load", function(){
    this._updateFilter();
}.bind(this));

_updateFilterメソッドは、そのコンストラクターのプロトタイプ オブジェクトに属します。

Constructor.prototype._updateFilter = function(){
    //  some code
};

Constructor の新しいインスタンスが作成される前に_updateFilterが呼び出されることに混乱しています。したがって、ありません:

var obj = new Constructor();

しかし、_updateFilterはオンロードで呼び出されますか? 誰かがこれを説明できますか?

ありがとう

4

1 に答える 1

1

リスナーのコールバックまたはコンストラクター自体が定義されているからといって、それが定義された時点で呼び出されるわけではありません。実際、コンストラクターは単なる関数です。関数宣言と同様に、呼び出されたときに何が起こるかを定義します。呼び出さなければ、何も起こりません。コンストラクターの場合、コンストラクターの新しいインスタンスを作成するときに呼び出されます。最終的に、アプリはコンストラクターを呼び出し、その時点で何が起こるかを次に示します。

  1. 特別なnewキーワードを使用して、JavaScript インタープリターにコンストラクター関数を呼び出し、その中に新しいオブジェクトを提供するように指示します。

  2. インタープリターはthis、コンストラクター内で、その新しいオブジェクトへのメモリ内の参照になるように設定します。

  3. 次に、イベント リスナーが に作成されますwindow。オブジェクトのクロージャであるコールバック関数をそのリスナーに渡し、this現在のthis参照を利用できるようにします。しかし、そのコールバックはまだ実行されておらず、ウィンドウのloadイベントが発生するまで実行されません。

  4. すぐに起動したと想像してください (つまり、実際にはコールバックではありませんでした)。問題が発生します。thisその時点で存在し、実際には既に から継承されていますConstructor.prototypeが、そのようなメソッドはありません_updateFilter。次に、インタープリターはプロトタイプチェーンを調べて、どちらにもそのような関数がないことを確認しConstructor.prototypeます。チェーンを上っていき、関数が見つからず、エラーがスローされます。ただし、コールバックはまだ起動していないことに注意してください。

  5. 実際に何が起こるかに戻る: 次にConstructor、 のプロトタイプを新しいメソッドで拡張し_updateFilterます。

  6. したがって、最終的にウィンドウのloadイベントが発生し、コールバックが実際に呼び出されます。インタプリタは に が存在するかどうかを確認し、_updateFilter存在thisしないことを確認してから、そのプロトタイプ チェーンを調べます。これで、関数が に存在することがわかり、Constructor.prototypeそのコードが実行されます。

于 2013-05-29T21:39:14.883 に答える