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

您有问题,因为thisin与外部功能method1()不同this。那是因为在 JS 函数中创建了作用域。

第一种方法

所以你可能想a成为一个变量,而不是一个属性this

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

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

第二种方法

或者,您可能希望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
    }
  }
}

第三种方法

最后,您还可以使用bind()将外部绑定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 回答