CoffeeScript实例变量

时间:2012-04-12 21:21:17

标签: coffeescript instance-variables

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

testObject = 

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

  methodOne: ->
    message = "Foo!"

  methodTwo: ->
    alert message

但是,您无法在CoffeeScript中使用var,如果没有该声明,message仅在methodOne内可见。那么,如何在CoffeeScript中的对象中创建实例变量?


更新:修复了我的示例中的拼写错误,因此方法实际上是方法:)

4 个答案:

答案 0 :(得分:12)

你不能那样。引用language reference

  

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

然而,您在JS中尝试做的事情也是不可能的,它等同于

testObject = {
    var message;
    methodOne: message = "Foo!",
    methodTwo: alert(message)
}

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

testObject =
    message: ''
    methodOne: ->
        this.message = "Foo!"
    methodTwo: ->
        alert message

您还可以使用@作为“此”的快捷方式,即@message代替this.message

或者考虑使用CoffeeScript的class syntax

class testObject
    constructor: ->
        @message = ''

    methodOne: ->
        @message = "Foo!"

    methodTwo: ->
        alert @message

答案 1 :(得分:5)

只是为了添加@ Lauren的答案,你想要的基本上是module pattern

testObject = do ->

  message = null

  methodOne = ->
    message = "Foo!"

  methodTwo = ->
    alert message

  return {
    methodOne
    methodTwo
  }

其中message是仅适用于这些方法的“私有”变量。

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

message = null

testObject = 
  methodOne: -> message = "Foo!"
  methodTwo: -> alert message

答案 2 :(得分:1)

您可以使用以下内容定义属性:

message: null

但是,您目前没有定义方法 - 您需要->

然后,要引用方法中的实例属性,请在属性名称前加上@

testObject = 

  message: null

  methodOne: ->
    @message = "Foo!"

  methodTwo: ->
    alert @message

答案 3 :(得分:0)

使用@指向this

testObject = 

  methodOne: ->
    @message = "Foo!"

  methodTwo: ->
    alert @message

fixed version on coffeescript.org