11

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

testObject = 

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

  methodOne: ->
    message = "Foo!"

  methodTwo: ->
    alert message

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


更新:修复了我的示例中的错字,因此这些方法实际上是方法:)

4

4 回答 4

12

你不能这样。引用语言参考

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

但是,您尝试做的事情在 JS 中也不可能,它相当于

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

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

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

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

或者考虑使用 CoffeeScript 的类语法

class testObject
    constructor: ->
        @message = ''

    methodOne: ->
        @message = "Foo!"

    methodTwo: ->
        alert @message
于 2012-04-12T21:31:49.747 回答
5

只是为了添加@Lauren的答案,您想要的基本上是模块模式

testObject = do ->

  message = null

  methodOne = ->
    message = "Foo!"

  methodTwo = ->
    alert message

  return {
    methodOne
    methodTwo
  }

message仅对这些方法可用的“私有”变量在哪里。

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

message = null

testObject = 
  methodOne: -> message = "Foo!"
  methodTwo: -> alert message
于 2012-04-13T00:09:57.717 回答
1

您可以使用以下方式定义属性:

message: null

但是,您当前没有定义方法——您需->要这样做。

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

testObject = 

  message: null

  methodOne: ->
    @message = "Foo!"

  methodTwo: ->
    alert @message
于 2012-04-12T21:29:30.617 回答
0

用来@指向this

testObject = 

  methodOne: ->
    @message = "Foo!"

  methodTwo: ->
    alert @message

coffeescript.org 上的固定版本

于 2012-04-12T21:32:44.163 回答