2012-02-27 41 views
9

Tôi có file 2 lớp:file Node coffeescript lớp và thừa kế

foo.coffee: class Foo

bar.coffee: class Bar extends Foo

Làm thế nào để xác định các lớp này để họ có sẵn trên toàn cầu? Tôi gặp lỗi trong số Bar rằng Foo không được xác định.

Tôi có tệp index.js mà tôi gọi node để chạy tập lệnh. Dưới đây là nội dung của index.js, tôi hầu như đã làm sai điều này cũng:

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

Trả lời

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" 

CẬP NHẬT: Bạn cũng cần chạy các tệp .coffee với coffee, trừ khi bạn biên dịch chúng trước.

CẬP NHẬT 2: Cách bạn cấu trúc các mô hình của mình tùy thuộc vào bạn. Tôi thích mô hình ở trên (nơi mô-đun đơn giản chỉ xuất cho một hàm - đó là khi bạn cần chỉ định cho module.exports vì bạn không thể chỉ định cho exports) nhưng những người khác thích cấu trúc như sau:

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 

Trong đó mỗi mô-đun xuất một đối tượng với một hoặc nhiều thuộc tính.

+0

tôi muốn kêu vang trong và nói rằng tôi đồng ý với Linus và làm thế nào một module nên xuất khẩu chỉ lớp. Tất nhiên, có một số ngoại lệ, nhưng tổng thể đó là thực hành tốt. –

+0

(Lời xin lỗi cho OT!) - @Linus: Bạn có thể giới thiệu phương pháp sử dụng kỹ thuật tương tự ở phía khách hàng không? RequireJS (có vẻ như rất nhiều chi phí)? – polarblau

+1

@polarblau: Chắc chắn, tôi sử dụng [stitch] (https://github.com/sstephenson/stitch) hoạt động rất tốt cho tôi. Nhỏ, nhẹ và cung cấp cho bạn 'yêu cầu' trên máy khách. –

3

Bạn cũng có thể viết:

class @MyClass 
    [...] 

{MyClassName} = require './myclassFile' 
myClass = new MyClassName 
Các vấn đề liên quan