2014-02-06 111 views
0

我有一個情況,我想模擬一個函數,如果某些條件滿足,我收到一個錯誤。javascript嘲笑原型函數錯誤

這裏是有條件地選擇是否嘲笑功能

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」。 –

+0

謝謝 - 我實際上嘗試綁定第一次,但意外綁定它的回調 - doh'methodTwo(function(err){}。bind(this))' –