6

node.jsファイルでクラスを機能させるのに問題があります。作成したモジュールが必要になると、require'./module'がコンストラクターを呼び出し、エラーを出します。しかし、実際にはファイルの後半でインスタンス化したいと思います。

すなわち

class Mic

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

exports.Mic = Mic

これが私のapp.coffeeファイルです

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

app.coffeeを実行すると、例外ReferenceErrorが発生します:xが定義されていません。コンストラクターを呼び出すので、これは理にかなっていますが、新しいマイクを呼び出していないのに、なぜコンストラクターを呼び出すのですか?

インデントを修正した後に編集する

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

exports.Mic = Mic

app.coffeeをに更新します

Mic = require './Mic'

m = new Mic 3
console.log m

エラーが発生します

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

1 に答える 1

17

まず最初に:あなたは必要ありませんrequire 'coffee-script'—それを実行するcoffeeだけで十分です。コンパイルされたJavaScriptを実行するのと同じです。プログラムで実行時に利用可能なCoffeeScriptライブラリは必要ありません。

次に、最初のファイルが正しくインデントされていないように見えます。これをコンストラクターにしたい場合はMic、の1つ下のレベルにインデントしますclass

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

exports.Mic = Mic

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

exports.Mic = Mic

オブジェクトのキーを割り当てMicたので、Mic.coffeeでは次のようになります。exportsMicexports

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

あなたが言うときrequire './Mic'、あなたはそのオブジェクトを取り戻しています。言い換えると:

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

したがって、次のいずれかを実行する必要があります。

  1. キーとしてではなく、Mic.coffeeのエクスポートMic全体としてエクスポートします。

    module.exports = Mic
    
  2. モジュール全体を取り出して、次のMic範囲内でオブジェクトをインスタンス化します。

    mic = require './Mic'
    m = new mic.Mic 3
    
  3. 'dモジュールMicから取り出してください:require

    {Mic} = require './Mic'  # equivalent to saying Mic = require('./Mic').Mic
    m = new Mic 3
    
于 2012-05-27T06:36:33.620 に答える