这是我正在尝试做的事情的一个例子。
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'"
不太确定为什么我会收到此错误。任何帮助将不胜感激。
当您从构造函数返回一个新对象时,它不会共享原型。一个正确的构造函数将属性/方法添加到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}"
这在功能上与上述相同,只是这里的basicInfo
和detailedInfo
已经在 prototype
,它们应该在的地方。有了这个,User::displayName = -> console.log @name
应该可以正常工作。
见 http://coffeescript.org/#classes
你正在尝试在 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