2013-03-06 50 views
1

「我有認識一塊我的代碼的問題:調用父原型法

 //constructor 
     function Widget (options) {    
     }; 

     //return the string 
     Widget.prototype._addEditFormString = function (val) { 
      return "<input type='text' value='" + val + "' >";     
     } 
     //initializing method 
     Widget.prototype.init = function() { 
      var addRowButton = document.getElementsByName("addRow")[0];    
      addRowButton.addEventListener("click", this.addRow, false);     
     }; 
     //this context in this method still confusing me 
     Widget.prototype.addRow = function() {  
      console.log(this._addEditFormString);//Uncaught TypeError: Object #<HTMLInputElement> has no method '_addEditFormString'     
     } 
     var wid = new Widget(); 

     wid.init(); 

問題 - 在init()方法我添加事件偵聽器(addRow方法),但在addRow方法我不。知道如何捕捉我的構造類的「this」,因爲我想調用_addEditFormString()方法,但接收到「未捕獲的TypeError:Object [object Window]沒有方法'_addEditFormString'」。我如何解決沒有Widget.prototype ._addEditFormString?或者只有一個解決方案?謝謝。

回答

1

問題是事件處理程序中的上下文是窗口,而不是您的Widget

變化

Widget.prototype.init = function() { 
    var addRowButton = document.getElementsByName("addRow")[0];    
    addRowButton.addEventListener("click", this.addRow, false);     
}; 

Widget.prototype.init = function() { 
     var _this = this; 
     var addRowButton = document.getElementsByName("addRow")[0];    
     addRowButton.addEventListener("click", function(){_this.addRow()}, false);     
}; 

編輯關於評論你的問題:

你似乎想

Widget.prototype._addEditFormString.call(this); 
+0

感謝您的回答,但在addRow()中捕獲「this」的問題會導致addEventListener在「this」中傳遞爲BUTTON。如何調用Widget.prototype._addEditFormString()像this._addEditFormString()? – 2013-03-06 14:58:33

+0

@ user1506183我不確定我是否收到你的問題,但是我編輯了我的答案。 – 2013-03-06 15:00:36

+0

是的。得到這個,非常感謝函數(){_ this.addRow()}解決我的問題) – 2013-03-06 15:03:01