2015-10-25 256 views
2

代碼:遺漏的類型錯誤:方法是不是一個函數

function Hotel(name,rooms,bookings){ 

    this.name = name; 
    this.rooms = rooms; 
    this.bookings = bookings; 

    this.checkAvailability = function(){ 
     return this.rooms - this.bookings; 
    } 

    this.bookRoom = function(){ 
     if(this.checkAvailability() > 1){ 
      return this.bookings++; 
     } 
    } 

    this.cancelBooking = function(){ 
     if(this.bookings < 1){ 
      return this.bookings--; 
     } 
    } 
} 


var grandHotel = new Hotel('Hotel Grand', 20, 5); 
var addBooking = document.getElementById("book"); 

addBooking.addEventListener('click', grandHotel.bookRoom, false); 

如果我點擊addBooking元素我得到這個錯誤:

Uncaught TypeError: this.checkAvailability is not a function.

+0

的可能的複製[如何進行 「this」 關鍵字的工作?](http://stackoverflow.com/questions/3127429/how-does-the-this-keyword工作) –

回答

3

您需要更改的事件是如何被約束。

addBooking.addEventListener('click', grandHotel.bookRoom.bind(grandHotel), false); 

addBooking.addEventListener('click', function() { grandHotel.bookRoom(); }, false); 
+0

非常感謝你。 現在我明白了,以爲我可以直接在addEventlistener的函數參數中放置一個方法。 真心感謝您的幫助先生。 – nikodeguzman

+0

@nikodeguzman指出,通過在閉包中捕獲「this」(比如'var that = this;'並使用'that'而不是this),可以更普遍地解決問題。 –

+0

@AlexeiLevenkov嗯,這裏的'this'在哪裏?我知道你在說什麼,但在這種情況下沒有這個,「這個」是'grandHotel' – epascarello

相關問題