2

通常、呼び出しthisは機能します。しかし、私は別のコンテキストでメソッドを呼び出しているのでthis、「親」オブジェクトではなくそのコンテキストを参照しています。

コードは次のとおりです。

var someConfig = {
  things: [
    {
      attr1: 'foo',
      attr2: 'bar',
      action: function() {
        console.log(this);
      }
    }
  ]
}

function Constructor(config) {
  var self = this;
  self.name = 'test';
  self.things = config.things;

  $.each(self.things, function(i, thing) {
    thing.action();
  });
    }

var obj = new Constructor(someConfig);
console.log(obj);

ここに jsfiddle があります。目標は、コンソールにある両方のオブジェクトを同じにすることですが、メソッドthisのコンテキストでは、コンストラクターではなく、属している元のオブジェクトを返します。actionaction

私が考えることができる唯一のことはに渡すことですがselfactionもっと良い方法があると思います。

4

3 に答える 3

3

まず、コードに関するいくつかのポイント。config プロパティはuniqueAction、後で として参照しますconfig.action。呼び出すときはobj.action、次のような関数として呼び出す必要があります。obj.action();

それを念頭に置いて、以下はあなたが必要とすることをするようです...

var config = {
  action: function() {
    console.log(this.name);//<- IMPORTANT PART
  }
}

function Constructor(config) {
  var self = this;
  self.name = 'test';
  self.action = config.action;
}

var obj = new Constructor(config)
obj.action();

の代わりにconsole.log呼び出しが使用されていることに注意してください。this.nameself.name

これが実際の例です

于 2013-01-10T16:08:38.390 に答える
1

コンストラクターに渡された関数は、コンストラクターの他のプロパティにアクセスできますか?

はい。ただし、そのオブジェクトを関数に渡す (またはthisキーワードを暗黙的に使用する) 場合のみです。

あなたが試みたのはself、コンストラクターの外部で宣言された関数からローカル変数にアクセスすることでした。これは不可能です。

だからただ使う

{
  action: function() {
    console.log(this.name);
//              ^^^^
  }
}

を呼び出すときはobj.action()thisインスタンスを指します。

于 2013-01-10T16:40:33.290 に答える
1

thing私が見る唯一の方法は、を呼び出す前に「コンストラクター」を構成に追加することactionです。

あなたのものからフォークされたこの Fiddleをチェックしてください。私は2つのことを変更しました:

まず、action関数は を参照するのthisではなく、 のプロパティparentを参照しますthis

  action: function() {
    console.log(this.parent);
//                  ^^^^^^^
  }

次に、各thingオブジェクトはparentを参照するプロパティを受け取りますself

  $.each(self.things, function(i, thing) {
    thing.parent = self;
    thing.action();
  });
于 2013-01-10T17:16:29.043 に答える