4

JavaScript では、私が持っている場合:

var foo = function(){}

foo.prototype.bar = function() {
    console.log(this);
}

baz = new foo();
baz.name = 'baz';

bing = new foo();
bing.name = 'bing';

baz.bar();
bing.bar();

setTimeout(baz.bar);
setTimeout(bing.bar);

私のコンソールではbaz、、、、オブジェクトbingがこの順序でログに記録されています。windowwindow

見るために必要な最も単純な、または「通常の」トリックは次のとおりです。

baz, bing, baz,のプロトタイプの関数bing内で「このような」変数を使用してログに記録されます。barfoo

「このような」とはbar()、オブジェクトにアクセスするために内部で使用できる変数のことであり、現在と将来の両方のメソッドです。

編集:

さらに明確にするために、 bar() をいつ呼び出すかを知る必要がないようにしたいと思いthisますbind()。私がbar()baz や bing を呼び出しているとき、それは「ブラック ボックス」であると仮定します。bar() を bing または baz のメソッドとして、それがどのように機能するかを知らずに呼び出したいと思います。また、bar() の内部で、それがどのオブジェクトのメソッドであるかを認識したいと考えています。

4

3 に答える 3

1

を使用したくない場合の 1 つの戦略は、bind()構築時に「バインドされた」メソッドをオブジェクトにアタッチし、「間接的に」 を参照することthisです。

これ:

var foo = function(){
  var _this = this;
  this.bar = function() {
    console.log(_this);
  }
}


baz = new foo();
baz.name = 'baz';

bing = new foo();
bing.name = 'bing';

baz.bar();
bing.bar();

setTimeout(baz.bar);
setTimeout(bing.bar);

ログ:

baz
bing
baz
bing

しかし、一般的に、私はthis可能な限り使用しapply()たいので、必要に応じて他のオブジェクトへのメソッドを使用できます。そして、「遅延呼び出し」を匿名関数でカプセル化するだけthisです。

setTimeout(function() { baz.bar(); });
setTimeout(function() { bing.bar(); });
于 2013-06-13T15:01:09.017 に答える
1

以下を使用しますbind(ただし、古いブラウザーではシムが必要になる場合があります)。

setTimeout(baz.bar.bind(baz));
setTimeout(bing.bar.bind(bing));
// btw,
//         baz.bar.bind(bing)
//         foo.prototype.bar.bind(bing)
// would have the same result
于 2013-06-13T14:47:34.367 に答える
0

最近、私は便宜上、この種のことを頻繁に行います。トリックではなく、スコープだけです。

function () {

function _this() {
  return window.myObject;
}

window.myObject = {
  myMethod: function myMethod() {
    _this().myOtherMethod();
  },

  myOtherMethod: function myOtherMethod() {

  }
}

}();
于 2014-11-24T13:16:35.193 に答える