When you return a new object from the constructor, it does not pass the prototype. A proper constructor adds properties / methods to 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}"
You might want to use the CoffeeScript abstraction class, which simply generates standard constructor functions:
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 prototype, . User::displayName = -> console.log @name .
. http://coffeescript.org/#classes