2012-05-27 4 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が定義されていません。コンストラクタを呼び出した後には意味がありますが、新しいマイクと呼ばれることはありませんが、コンストラクタを呼び出すのはなぜですか?

編集

Mic = require './Mic' 

m = new Mic 3 
console.log m 

に私のapp.coffeeをインデント

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

exports.Mic = Mic 

を固定し、更新した後で、私は

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

答えて

17

まず最初の最初のエラーを取得:あなたドンが必要です- coffeeで実行しても十分です。コンパイルされたJavaScriptを実行するのと同じです。プログラムで実行時に利用できるCoffeeScriptライブラリは必要ありません。

第2に、最初のファイルが間違ってインデントされているように見えます。あなたはそれがMicのコンストラクターになりたい場合は、classの下にあるレベルをインデント、すなわち:

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

exports.Mic = Mic 

最後に、問題がexportsは、輸出の対象であるということです。ここを参照してください:

exports.Mic = Mic 

あなたは今Mic.coffeeでexportsは次のようになり、exportsオブジェクトのMicキーにMicを割り当てた:あなたはrequire './Mic'を言うとき

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

、あなたはそれを取得していますオブジェクトを戻す。他の言葉で:マイクの全体の輸出として

  1. 輸出Mic

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

    だからあなたは、次のいずれかを実行する必要があります。コーヒーではなく、キーとして:

    module.exports = Mic 
    
  2. は、モジュール全体を取得し、その後、内Micオブジェクトをインスタンス化:ちょうどrequire「Dモジュールから出Micを取る

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

ねえ、おっと私は料理wを交換するために忘れてしまいましたマイクそれはコピー&ペーストの問題でした。私はコードをインデントして、今はTypeErrorを取得しています。オブジェクトはObject.CALL_NON_FUNCTION_AS_CONSTRUCTORの関数ではありません。マイク=新しいマイク3を呼び出すまで、コードは自動的にインスタンス化されません。 –

+0

それに応じて回答が更新されました。 – Ashe

+0

ああそこに行きます。トリックをしてくれてありがとう! –

関連する問題