CoffeeScript实例变量

And*_*rew 10 instance-variables coffeescript

我正在学习CoffeeScript,我有一个轻微的头痛,我还没弄清楚.如果我创建一个对象来做某些事情,我偶尔需要一个实例变量来在该方法之间共享该对象.例如,我想这样做:

testObject = 

  var message # <- Doesn't work in CoffeeScript.

  methodOne: ->
    message = "Foo!"

  methodTwo: ->
    alert message
Run Code Online (Sandbox Code Playgroud)

但是,您不能var在CoffeeScript中使用,并且没有该声明message仅在内部可见methodOne.那么,如何在CoffeeScript中的对象中创建实例变量?


更新:修复了我的例子中的拼写错误,所以方法实际上是方法:)

Lau*_*ren 12

你不能那样.引用语言参考:

因为您无法直接访问var关键字,所以不可能故意为外部变量设置阴影,您只能引用它.因此,如果您正在编写一个深层嵌套的函数,请注意不要意外地重用外部变量的名称.

然而,你要做的事情在JS中也是不可能的,它将等同于

testObject = {
    var message;
    methodOne: message = "Foo!",
    methodTwo: alert(message)
}
Run Code Online (Sandbox Code Playgroud)

这是无效的JS,因为你不能在这样的对象中声明一个变量; 您需要使用函数来定义方法.例如在CoffeeScript中:

testObject =
    message: ''
    methodOne: ->
        this.message = "Foo!"
    methodTwo: ->
        alert message
Run Code Online (Sandbox Code Playgroud)

您也可以使用@'this.'的快捷方式,即@message代替this.message.

或者考虑使用CoffeeScript的类语法:

class testObject
    constructor: ->
        @message = ''

    methodOne: ->
        @message = "Foo!"

    methodTwo: ->
        alert @message
Run Code Online (Sandbox Code Playgroud)


Ric*_*asi 5

只是为了增加@Lauren的答案,你想要的基本上是模块模式:

testObject = do ->

  message = null

  methodOne = ->
    message = "Foo!"

  methodTwo = ->
    alert message

  return {
    methodOne
    methodTwo
  }
Run Code Online (Sandbox Code Playgroud)

哪个message是"私有"变量,仅适用于这些方法.

根据上下文,您还可以在对象之前声明消息,以便它可用于两个方法(如果在此上下文中执行):

message = null

testObject = 
  methodOne: -> message = "Foo!"
  methodTwo: -> alert message
Run Code Online (Sandbox Code Playgroud)