2
var x = (arg1, arg2) {
  this.y = arg1;
  this.z = arg2;
}

x.prototype.a = function() {
  var self = this;
  some_obj1.on('data', function() {
    self.y = 'new y value';
  });
}

x.prototype.b = function() {
  var self = this;
  some_obj2.on('data', function() {
    self.z = 'new z value';
  });
}

有没有办法将 self 声明为实例变量(显然不使用'this'),这样它就不需要在每个函数中声明?例如,'a' 的声明将是:

x.prototype.a = function() {
  ob2.on('data', function() {
    self.z = 'some new value';
  });
}

希望这个例子足够清楚,它没有经过测试(在提问时即时编写)和更多的伪代码,但应该明白这一点..

4

2 回答 2

2

最好的办法是部分应用参数。下面是较新的跨浏览器实现Function.prototype.bindproject.bind, 使用下面的实现,Function.prototype.bind如果它可用,将使用原生,如果原生不可用,将使用自定义实现。

更新 我创建了一个工作Fiddle

project = {};
project.bindJs_ = function(fn, selfObj, var_args) {
  if (!fn) {
    throw new Error();
  }

  if (arguments.length > 2) {
    var boundArgs = Array.prototype.slice.call(arguments, 2);
    return function() {
      // Prepend the bound arguments to the current arguments.
      var newArgs = Array.prototype.slice.call(arguments);
      Array.prototype.unshift.apply(newArgs, boundArgs);
      return fn.apply(selfObj, newArgs);
    };

  } else {
    return function() {
      return fn.apply(selfObj, arguments);
    };
  }
};
// A router for the native Function.prototype.bind
project.bindNative_ = function(fn, selfObj, var_args) {
  return /** @type {!Function} */ (fn.call.apply(fn.bind, arguments));
};



   project.bind = function() {
       if (Function.prototype.bind &&
           Function.prototype.bind.toString().indexOf('native code') != -1) {
           project.bind = project.bindNative_;
       } else {
           project.bind = project.bindJs_;
       }
       return project.bind.apply(null, arguments);
    };

现在你可以这样做:

x.prototype.a = function() {
  ob2.on('data', project.bind(function() {
    // the this. object inside the function will now point to x.
    this.z = 'some new value';
  }, this, any, argument, you, want, to, pass));
}
于 2013-04-09T11:18:33.880 回答
2

不,你不能。您需要以某种方式修改范围链以避免使用this。一个稍微干净的方法是使用Function#bind来指定this.

x.prototype.a = function() {
  ob2.on('data', function() {
    this.z = 'some new value';
  }.bind(this));
}
于 2013-04-09T11:19:50.320 回答