Here's an example of what I'm trying to do.
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()
I'm getting an error that says "Uncaught TypeError: Object # has no method 'displayName'"
Not really sure why I'm getting this error. Any help is greatly appreciated.
When you return a new object from the constructor, it doesn't share 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 take advantage of CoffeeScript's class
abstraction, which just 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}"
This is functionally the same as above, except that basicInfo
and detailedInfo
here are already in the prototype
, where they should be. With this, User::displayName = -> console.log @name
should work fine.
See http://coffeescript.org/#classes
You're trying to copy javascript in coffeescript. Badly. (By mixing static methods and prototype methods.)
In CoffeeScript, you can use the keyword class
to do what you want.
class User
constructor: (@name, @dob) ->
displayName: ->
console.log @name
bob = new User "Bob", "10/12/69"
bob.displayName() // "Bob"
More information: http://coffeescript.org/#classes
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With