2012-09-07 36 views
19

Tôi đang làm việc trên một ví dụ đơn giản; Tôi có thể làm cho nó hoạt động với Javascript, nhưng có điều gì đó sai với phiên bản CoffeeScript của tôi.Mô-đun Node.js.exports trong CoffeeScript

Đây là person.coffee:

module.exports = Person 

class Person 
    constructor: (@name) -> 

    talk: -> 
     console.log "My name is #{@name}" 

Và đây là index.coffee:

Person = require "./person" 
emma = new Person "Emma" 
emma.talk() 

Tôi đang mong đợi để chạy index.coffee và xem giao diện điều khiển đầu ra "Tên tôi là Emma" . Thay vào đó, tôi nhận được một lỗi nói rằng TypeError: undefined không phải là một hàm.

Trả lời

26

Đặt dòng module.exports ở dưới cùng.

---- person.coffee ----

class Person 
    constructor: (@name) -> 

    talk: -> 
     console.log "My name is #{@name}" 

module.exports = Person 

Person = require "./person" // [Function: Person] 
p = new Person "Emma" // { name: 'Emma' } 

Khi bạn gán cho module.exports ở phía trên, biến Person vẫn là undefined.

+0

Vậy đó! Cảm ơn rất nhiều. –

+0

fyi: để hiểu tại sao nó có thể hữu ích để xem xét các mô hình truyền thống trong javascript để tạo mô-đun – froginvasion

15

Bạn cũng có thể viết trong person.coffee:

class @Person 

Sau đó sử dụng sau trong index.coffee:

{Person} = require './person' 
+0

Cố gắng này và tiếp tục nhận được 'đối tượng không phải là một lỗi chức năng'. – majidarif

+0

@majidarif Hãy xem mã được biên dịch của bạn để kiểm tra xem nó có hợp lý không. Bạn có đang chạy trong môi trường hoặc trình duyệt Node.js không? – vaughan

+0

Tôi thực sự đang ở trên Node.js, tôi có 2 lớp trên 1 tệp và 2 lớp mở rộng một và một trong các lớp đó. Sau đó, subcass là một trong những tôi cần thiết để xuất khẩu. – majidarif

5

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

module.exports = class Person 
    constructor: (@name) -> 
    console.log "#{@name} is a person" 

sau đó trong index.coffee hoặc

bob = new require './person' 'Bob' 

hoặc bạn có thể làm theo cách này

Person = require './person' 
bob = new Person 'bob' 
2

Những câu trả lời khác nhau ở đây dường như đưa cho các cấp rằng chỉ có một đối tượng xuất khẩu bởi module là lớp (loại "Java cách suy nghĩ")

Nếu bạn cần phải xuất khẩu một số đối tượng (lớp học, chức năng, vv), nó có lẽ nên là tốt nhất để viết:

exports.Person = class Person 
    [...] 


coffee> { Person } = require "./person" 
coffee> p = new Person "Emma"