5

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

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()

我收到一条错误消息,上面写着“未捕获的类型错误:对象 # 没有方法 'displayName'”

不太确定为什么我会收到此错误。任何帮助是极大的赞赏。

4

2 回答 2

4

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

在 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

于 2012-07-04T14:15:57.397 回答
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}"

这在功能上与上面相同,除了basicInfoand detailedInfohere 已经在prototype它们应该在的位置。有了这个,User::displayName = -> console.log @name应该可以正常工作。

http://coffeescript.org/#classes

于 2012-07-05T00:05:30.197 回答