2012-05-27 21 views
6

我在嘗試讓我的課程在我的node.js文件中工作時遇到問題。當我需要我編寫的模塊時,require'./module'調用我的構造函數並給出錯誤。但我實際上想稍後在文件中實例化。Coffeescript和node.js混淆。需要實例化類?

class Mic 

constructor: (x) -> 
    @t = [] 
    @t.push x 

exports.Mic = Mic 

,這裏是我的app.coffee文件

require 'coffee-script' 
require './Mic' 

當我運行app.coffee它給出了一個例外的ReferenceError:X沒有定義。這是有道理的,因爲它調用構造函數,但爲什麼它調用構造函數,即使我沒有叫新的麥克風?

編輯 我app.coffee固定壓痕

class Mic 
    constructor: (x) -> 
     @t = [] 
     @t.push x 

exports.Mic = Mic 

,並更新到

Mic = require './Mic' 

m = new Mic 3 
console.log m 

後,我得到的錯誤

TypeError: object is not a function 
    at Object.CALL_NON_FUNCTION_AS_CONSTRUCTOR (native) 

回答

17

第一件事的第一:你不不需要require 'coffee-script'-用coffee運行就夠了;與運行編譯的JavaScript相同。您的程序不需要運行時可用的CoffeeScript庫。

其次,第一個文件顯示不正確縮進;如果你想,要成爲Mic的構造,它縮進的class下方即:一個水平,

class Mic 
    constructor: (x) -> 
    @t = [] 
    @t.push x 

exports.Mic = Mic 

最後,問題是exports是出口的對象。在這裏看到:

exports.Mic = Mic 

您分配Micexports對象的Mic關鍵,所以現在exports在Mic.coffee看起來是這樣的:

{ Mic: ...your class... } 

當你說require './Mic',你得到的是反對;換句話說:

require('./Mic') == { Mic: ...your class... } 

所以,你需要做以下之一:

  1. 出口Mic作爲話筒的整個出口。咖啡,而不是作爲一個重點:

    module.exports = Mic 
    
  2. 獲取整個模塊出來,然後實例中Mic對象:

    mic = require './Mic' 
    m = new mic.Mic 3 
    
  3. 就拿Micrequire「d模塊出:

    {Mic} = require './Mic' # equivalent to saying Mic = require('./Mic').Mic 
    m = new Mic 3 
    
+0

哎,哎呀,我忘了更換菜w^ith Mic。這是一個複製和粘貼問題。我縮進了我的代碼,現在我得到一個TypeError:對象不是Object.CALL_NON_FUNCTION_AS_CONSTRUCTOR處的函數。該代碼不會自動實例化,直到我打電話給麥克風=新的麥克風3時,然後給出以前的錯誤。 –

+0

相應地更新了答案。 – Ashe

+0

啊,我們走吧。謝謝你做到了! –