4

私はこれに間違ってアプローチしているかもしれません...

オブジェクトの状態を内部的に追跡し、それを使用して変更されたメソッドを呼び出そうとしています:

createObject = function() {
  this.a = 1

  this.method1 = function() {
  if (this.a == 1 ) {
    //do stuff
    this.a = 0
  }
}

var x = new createObject()

残念ながら、状態は内部的に追跡されていません。ただし、別のオブジェクトのプロパティを変更すると、完全に機能します。

otherObj = { a:1 }

createObject = function() {

  this.method1 = function() {
  if (this.a == 1 ) {
    //do stuff
    otherObject.a = 0
  }

}

var x = new createObject()

これはこれにアプローチする正しい方法ですか?

4

1 に答える 1

13

in は外部関数とは異なるためthis、問題があります。これは、JS 関数がスコープを作成するためです。method1()this

最初のアプローチ

aしたがって、のプロパティではなく、変数になりたい場合がありthisます。

createObject = function() {
  // 'a' is now available here...
  var a = 1

  this.method1 = function() {
    // ... and here as well.
    if (a == 1 ) {
      a = 0
    }
  }
}

2 番目のアプローチ

thisまたは、ヘルパー変数 (selfこの例で呼び出されます) でアウターへの参照を保持することもできます。

createObject = function() {
  // 'self' is a regular varialbe, referencing 'this'
  var self = this;
  this.a = 1

  this.method1 = function() {
    // Here, self !== this, because 'this' in method1() 
    // is different from 'this' in outer function.
    // So we can access 'self.a':
    if (self.a == 1 ) {
      //do stuff
      self.a = 0
    }
  }
}

3 番目のアプローチ

最後に、bind()outer を次のように結び付けるために使用することもできthisますmethod1()

var createObject = function () {
    this.a = 1

    this.method1 = function () {
        console.log(this.a);
        if (this.a == 1) {
            this.a = 0
        }
    }.bind(this);
    // ^ note `bind(this)` above. Now, 'this' inside 'method1'
    // is same as 'this' in outer function.
}

ここに のドキュメントがありbind()ます。IE < 9 では使用できないことに注意してください。

于 2013-10-19T12:22:17.510 に答える