2012-02-27 48 views
9

我有2類文件:節點CoffeeScript的類文件和繼承

foo.coffee:class Foo

bar.coffee:class Bar extends Foo

如何定義這些類,使他們在全球範圍內提供?我在Bar中得到Foo未定義的錯誤。

我有一個index.js文件,我打電話node來運行腳本。這裏是index.js的內容,我很可能這樣做是錯的也:

exports.Foo = require("./foo") 
exports.Bar = require("/bar") 

回答

19

foo.coffee:

class Foo 
    // ... 

module.exports = Foo 

bar.coffee:

Foo = require "./foo" 

class Bar extends Foo 
    // ... 

module.exports = Bar 

index.coffee:

exports.Foo = require "./foo" 
exports.Bar = require "./bar" 

更新:除非先編譯它們,否則還需要使用coffee運行.coffee文件。

更新2:您如何構建模型取決於您。我喜歡上面的圖案(其中簡單的模塊只導出的函數 - 這時候你需要分配給module.exports因爲你不能簡單地分配給exports)但也有人在這樣的結構:

foo.coffee:

class Foo 
    // ... 

exports.Foo = Foo 

bar.coffee:

Foo = require("./foo").Foo 

class Bar extends Foo 
    // ... 

exports.Bar = Bar 

index.coffee:

exports.Foo = require("./foo").Foo 
exports.Bar = require("./bar").Bar 

其中每個模塊導出包含一個或多個屬性的對象。

+0

我想幫腔,說我和Linus以及如何模塊應該只導出類的同意。當然,也有一些例外,但總的來說這是很好的做法。 – 2012-03-02 16:15:19

+0

(道歉OT!) - @Linus:你能推薦一種在客戶端使用相同技術的方法嗎? RequireJS(似乎喜歡很多開銷)? – polarblau 2012-11-23 08:26:14

+1

@polarblau:當然,我使用[stitch](https://github.com/sstephenson/stitch),這對我來說效果很好。體積小,重量輕,可以在客戶端提供「需求」。 – 2012-11-23 10:09:07

3

你也可以這樣寫:

class @MyClass 
    [...] 

{MyClassName} = require './myclassFile' 
myClass = new MyClassName