1

私はC++から来ましたが、「これ」は実行コンテキストのみを意味することがわかりました。セルフインスタンスを取得する保証された方法はありますか?

私はいつもjavascriptで「this」によってインスタンスを取得しようとしているのでこれを尋ねますが、次のように説明する方法など、自分でそれを保証するためにさまざまな方法を実行する必要があります。

MyClass.prototype.OnSomethingHappened = function () {
  // I want to get the reference to the instance of this class.
}

しかし、この種の関数はしばしば次のように呼ばれます。

var bar = new MyClass();
foo.onclick = bar.OnSomethingHappened;

onclickが発生すると、OnSomethingHappenedが呼び出されますが、「this」はバーのインスタンスを意味するものではありません。

次のような解決策があります。

var bar = new MyClass();
foo.onclick = function () {
  bar.OnSomethingHappened();
}

はい、ここでは完全に機能します。しかし、考慮してください:

var bar = new MyClass();
MyClass.prototype.OnSomethingHappened = function () {
  // I want to get the reference to the instance of this class.
}
MyClass.prototype.IWantToBindSomething = function () {
  // sorry for using jquery in a pure javascript question
  $("div#someclass").bind("click", function () {
  bar.OnSomethingHappened();
  });  // I think this is a very very bad practice because it uses a global variable in a class, but I can't think of other workaround, since I have no guaranteed way of getting the instance.
}
4

1 に答える 1

2

いいえ、「クラス」の概念は、C++のようにJavaScriptには実際には存在しません。関数と特定のオブジェクトの間に本質的な関係はありません。関数は単なる値です。

(オブジェクトが関数を参照するプロパティを持っている場合、「カジュアル」な関係以外の関係はありません。)

ただし、ターゲット関数を使用または呼び出すthis別の関数で関数をラップすることにより、の特定の値を強制することは可能です。これは、新しいブラウザーで行うことも、単に匿名(または匿名ではない)ラッパーを使用して行うこともできます。.call().apply().bind()

編集—理解しておくべき重要なことthisは、その値は、呼び出しの各ポイントで、関数が呼び出される方法によって完全に決定されるということです。したがって、オブジェクトがある場合:

var myObj = new Something();

myObj.handlerイベントハンドラー(一般的な状況)として使用する場合this、イベントハンドラーでオブジェクトを参照するには、ラッパーが必要です。

$('whatever').click( function(ev) { myObj.handler(ev); } );

この例では、「myObj」がグローバル変数である必要はありません。

function justAnExample() {
  var myObj = new Something();

  $('whatever').click( function(ev) { myObj.handler(ev); } );
}

その点で、「myObj」が「justAnExample」関数内のローカル変数であることがはっきりとわかります。JavaScriptには実際のクロージャーがあるため、「justAnExample」の呼び出しコンテキストは呼び出し後も保持され、イベントハンドラーとしてjQueryに渡される匿名ラッパー関数で使用できます。

于 2013-01-12T20:57:51.670 に答える