如何更新对象内的JavaScript this指针以指向另一个对象?

时间:2010-10-06 13:41:08

标签: javascript this method-call

我在使用JavaScript和传递函数作为另一个函数的参数时遇到了一些麻烦。

让我们说我们在课堂上并做同样的事情:

this.get('target').update(this.onSuccess, this.onFail);
  • 'target'是一个JavaScript对象,它有一个名为update()
  • 的方法
  • 我正在调用此方法并将调用者类的两个方法作为参数传递

在更新方法中发生了一些事情,当它完成时,该方法应该调用onSuccess方法或onFail方法。这看起来像是:

update: function(onSuccess, onFail) {
  if(true) {
    onSuccess();
  } else {
    onFail();
  }
}
直到现在,一切都很好!但是在调用者类(在update-method之上调用的那个)中定义的那些成功/失败方法中,我正在使用这个指针:

onFail: function() {
  alert('Error: ' + this.get('target').error);  
}

这个指针会导致一些问题。它没有指向最初定义方法的类,而是指向'target'对象。

我现在需要做的是在onSuccess / onFail调用“target”类内部之前更新this-pointer,以使方法再次起作用。但由于“无效指派左侧”错误,这不起作用。

这样的场景的最佳做法是什么?有任何想法吗? thx提前!!!

欢呼声

3 个答案:

答案 0 :(得分:3)

调用update()时有两种选择:

  • javascript function call()
  • javascript function apply()

主要区别在于如何将参数传递给它。但它们都允许范围/上下文注入。

您的代码应如下所示:

this.get('target').update.call(this, this.onSuccess, this.onFail);

答案 1 :(得分:3)

您可以创建一个函数,将函数“绑定”到某个对象(使用闭包),然后将这些绑定函数传递给处理程序:

function bind(obj, fun) {
   return function() {
      return fun.apply(obj, arguments);
   };
};

update(bind(this, this.onSuccess), bind(this, this.onFail));

答案 2 :(得分:1)

要重定向此项,您需要在bind()类中使用Function(或类似)方法,几乎​​所有JavaScript库都可以找到该方法:

if(!Function.prototype.bind){
    Function.prototype.bind = function(scope) {
      var _function = this;

      return function() {
        return _function.apply(scope, arguments);
      }
    }
}

现在做这样的事情:

update: function(onSuccess, onFail) {
  if(true) {
    onSuccess.bind(this)();
  } else {
    onFail.bind(this)();
  }
}

这里解释了这个机制:Binding Scope in JavaScript