javascript嘲笑原型函数错误

时间:2014-02-06 07:56:08

标签: javascript node.js

我有一个案例,如果满足某些条件并且我收到错误,我想模拟一个函数。

这是有条件地选择是否模拟函数的函数

MyClass.prototype.methodOne = function (callback) {
  var self = this;
  var methodTwo = this.methodTwo;
  if (someCondition) {
    methodTwo = function(callback) {
      callback(null);
    };
  }
  methodTwo(function (err) { });
}

MyClass.prototype.methodTwo = function (callback) {
  var self = this;
  var batch = new Batch();
  batch.concurrency(this.options.concurrency); ----> error here
  // some more stuff
  callback(err);
}

错误讯息为Uncaught TypeError: Cannot read property 'concurrency' of undefined

如果不是拨打methodTwo(function (err) { });而是拨打this.methodTwo(function (err) { });,那么一切正常。

1 个答案:

答案 0 :(得分:1)

var methodTwo = this.methodTwo;

将方法分配给变量时,函数会丢失其上下文,this不再引用原始对象。试试这个:

MyClass.prototype.methodOne = function (callback) {
  if (someCondition) {
    this.methodTwo = function(callback) {
      callback(null);
    };
  }
  this.methodTwo(function (err) { });
}

如果您不想永久覆盖methodTwo,请使用Function.prototype.bind

MyClass.prototype.methodOne = function(callback) {
    var methodTwo = this.methodTwo.bind(this);
    if (someCondition) {
        methodTwo = function(callback) {
            callback(null);
        };
    }
    methodTwo(function(err) {
    });
}

例如,

var o = {
  a: 'asdf',
  oMethod: function () {
    return this.a;
  }
};

在这里,如果您将oMethod分配给变量,则调用它会导致undefined

var oMethod = o.oMethod;
oMethod(); //undefined

var oMethod = o.oMethod.bind(o);
oMethod(); //asdf