2012-07-04 22 views
4

下面是我想要做的一個例子。CoffeeScript原型錯誤

User = (name,dob,rank,score) -> 
    { 
     name: name 
     dob: dob 
     details: { 
      rank: rank 
      score:score 
     } 

     basicInfo: -> return "Name: #{@name} - Dob: #{@dob} - #{@details.rank} " 
     detailedInfo: -> return "Name: #{@name} - Rank: #{@details.rank} - Score: #{@details.score}" 
    } 

User::displayName = -> 
    console.log @name 

bob = new User("Bob","10/12/69",1,100000) 

bob.displayName() 

我收到一個錯誤,指出「遺漏的類型錯誤:對象#有沒有方法‘顯示名’」

真的不知道爲什麼我得到這個錯誤。任何幫助是極大的讚賞。

+0

我沒有很好地CFS精通,但是這不是你如何在聲明它的類。請參閱:http://coffeescript.org/#classes – Zirak

回答

4

當你從構造函數返回一個新的對象,它不共享原型。一個適當的構造函數添加屬性/方法來this

User = (name,dob,rank,score) -> 
    @name = name 
    @dob = dob 
    @details = 
    rank: rank 
    score: score 
    @basicInfo = -> return "Name: #{@name} - Dob: #{@dob} - #{@details.rank} " 
    @detailedInfo = -> return "Name: #{@name} - Rank: #{@details.rank} - Score: #{@details.score}" 

你可能想利用CoffeeScript中的class抽象,它只是產生標準的構造函數:

class User 
    constructor: (name, dob, rank, score) -> 
    @name = name 
    @dob = dob 
    @details: 
     rank: rank 
     score: score 
    basicInfo: -> 
    return "Name: #{@name} - Dob: #{@dob} - #{@details.rank} " 
    detailedInfo: -> 
    return "Name: #{@name} - Rank: #{@details.rank} - Score: #{@details.score}" 

這在功能上與上面相同,除了basicInfodetailedInfo這裏已經在prototype,他們應該在那裏。有了這個,User::displayName = -> console.log @name應該可以正常工作。

http://coffeescript.org/#classes

4

您正在嘗試將javascript複製到coffeescript中。厲害。 (通過混合靜態方法和原型方法。)

在CoffeeScript中,您可以使用關鍵字class來做你想做的。

class User 
    constructor: (@name, @dob) -> 

    displayName: -> 
     console.log @name 

bob = new User "Bob", "10/12/69" 

bob.displayName() // "Bob" 

的更多信息:http://coffeescript.org/#classes

+0

您通常必須學習*更多*關於javascript才能正確使用coffeescript。這個問題與CS vs JS沒有任何關係,但是對構造函數的工作原理有誤解。 –

+0

不夠公平,那麼爲什麼要使用這種語法「User :: displayName - >」 – rai

+0

如果您使用過'class'關鍵字:-) –