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

「Uncaught TypeError: Object # has no method 'displayName'」というエラーが表示されます

なぜこのエラーが発生するのかよくわかりません。どんな助けでも大歓迎です。

4

2 に答える 2

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}"

class標準のコンストラクター関数を生成するだけの 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}"

これは機能的には上記と同じですが、basicInfodetailedInfohere が既に にあるprototypeべき場所にあります。これで、User::displayName = -> console.log @nameうまくいくはずです。

http://coffeescript.org/#classesを参照

于 2012-07-05T00:05:30.197 に答える
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

于 2012-07-04T14:15:57.397 に答える