2013-02-21 121 views
1

對於下面的代碼,我得到的GameStatsPanel功能的第二線以下錯誤:的JavaScript函數原型不能從構造的對象

"Uncaught TypeError: Object #Timer has no method 'start'"

我真的很困惑,爲什麼這種情況正在發生 - 我有一種感覺我錯過了一些簡單的地方,但我需要開悟。請隨時通過訪問www.letsplayglobalgames.com並選擇「Play!」來查看問題。選項從主頁。讓我知道你是否需要更多細節。

function GameStatsPanel() { 
    this.timer = new Timer(); 
    this.timer.start(); /* error is thrown here */ 
} 
function Timer() { 
    this.container = document.getElementById('game_time'); 
    this.current_flag_time_start; 
    this.current_flag_time_stop; 
    this.time_start = new Date(); 
    this.time_stop; 
    this.time_difference; 
    this.current_flag_time_difference; 
} 
Timer.prototype.start = function() { 
    this.current_flag_time_start = new Date(); 
} 
+0

難道你創建了'新GameStatsPanel對象()' – Musa 2013-02-21 06:14:14

+0

是的,我的代碼: gameStatsPanel =新GameStatsPanel(); – LetsPlayGlobalGames 2013-02-21 06:22:45

回答

3

你調用Timer構造的Timer.prototype必須設置與您的方法有機會了。

Timer函數可用,因爲函數聲明是「懸掛」的,因此可立即使用。

Timer.prototype的擴展不是「紅旗」,讓您Timer的未改進.prototype當你做new Timer

gameStatsPanel = new GameStatsPanel(); // Invoking this too soon. Put it and 
// ...       // anything else that uses the constructors at 
            // the bottom so the prototypes can be set up. 
function main() { 
    // ... 
} 

function GameStatsPanel() { 
    this.timer = new Timer(); // The `Timer.prototype` extensions haven't run yet 
    // ... 
    this.timer.start(); // .start doesn't yet exist 
} 

// ... 

function Timer() { 
    // ... 
} 

// ... 

// *Now* the .start() method is getting added. 
Timer.prototype.start = function() { 
    this.current_flag_time_start = new Date(); 
} 

// ... 
+0

感謝您的迴應,但我仍然有點困惑。在查看關於提升的更多信息之後,我理解了這個概念,但並不瞭解它如何應用於原型函數。你能否提供一些更多的細節或推薦一個解決問題的例子? – LetsPlayGlobalGames 2013-02-22 04:14:22

+0

@LetsPlayGlobalGames:函數聲明被掛起。這意味着就好像你在文件的頂部寫了Timer和GameStatsPanel函數。剩下的東西不動。因此,在上面的答案中考慮代碼,想象頂部的這兩個函數。然後在下面你做'gameStatsPanel = new GameStatsPanel();'。這調用'GameStatesPanel'函數,它調用'Timer',創建一個新的'Timer'實例。然後'Timer'實例調用它的'.start()'方法。麻煩的是,所有這些都發生在調用'GameStatsPanel()',這是... – 2013-02-22 04:26:17

+0

...位於* Timer.prototype.start = func ...行之前。這意味着你試圖在存在之前調用'.start()'。 [此代碼](http://jsfiddle.net/zQb6X/)可能有助於顯示它。 '.start()'不起作用,但如果你在調用構造函數之前將它移動得更高,它就會起作用,[像這樣](http://jsfiddle.net/zQb6X/2/)。 – 2013-02-22 04:27:20

相關問題