Javascript CoffeeScript原型错误

Javascript CoffeeScript原型错误,javascript,coffeescript,Javascript,Coffeescript,这是一个我正在尝试做的例子 User = (name,dob,rank,score) -> { name: name dob: dob details: { rank: rank score:score } basicInfo: -> return "Name: #{@name} - Dob: #{@dob} - #{@details.rank

这是一个我正在尝试做的例子

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()
我收到一个错误,上面写着“uncaughttypeerror:Object”没有方法“displayName”


我不太清楚为什么会出现这个错误。非常感谢您的帮助。

您正在尝试在coffeescript中复制javascript。非常(通过混合静态方法和原型方法。)

在CoffeeScript中,您可以使用关键字
class
来执行您想要的操作

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

    displayName: ->
        console.log @name

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

bob.displayName() // "Bob"

更多信息:

从构造函数返回新对象时,它不会共享原型。正确的构造函数会将属性/方法添加到此:

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 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}"
这在功能上与上述相同,只是
basicInfo
detailedInfo
已经在
原型中,它们应该在那里。这样,
User::displayName=->console.log@name
应该可以正常工作


请参见

我对CFS不太熟悉,但在CFS中声明类的方式并非如此。请参阅:为了正确使用coffeescript,您通常需要学习更多关于javascript的知识。这个问题与CS vs JS无关,只是对构造函数如何工作的误解。很公平,那么为什么要使用“User::displayName->”这个语法@rai看到Ricardo的答案,它实际上应该是公认的答案。@Ricardomasi很公平,我删除了这句话:)