2014-02-06 2 views
0

У меня есть случай, когда я хотел высмеять функцию, если какое-то условие выполнено, и я получаю сообщение об ошибке.javascript mocking ошибка функции прототипа

здесь функция, которая условно выбирает ли издеваться функцию

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) { }); все работает отлично. не

+0

Можете ли вы добавить в свой пример несколько предупреждений или console.log и рассказать, какое поведение вы принимаете? –

ответ

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 
+0

Я не уверен, что он хочет переписать 'methodTwo' для этого экземпляра permamently. –

+0

Спасибо - я на самом деле попытался связать сначала, но случайно привязал его к callback-doh 'methodTwo (function (err) {}. Bind (this))' –

Смежные вопросы