Переменная экземпляра CoffeeScript

Я изучаю CoffeeScript, и у меня есть одна незначительная головная боль, которую я не совсем понял. Если я создаю объект для выполнения определенных действий, мне иногда нужна переменная экземпляра для того, чтобы этот объект был разделен между методами. Например, я хотел бы сделать это:

testObject = 

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

  methodOne: ->
    message = "Foo!"

  methodTwo: ->
    alert message

Однако вы не можете использовать var в CoffeeScript, и без этого объявления message отображается только внутри methodOne. Итак, как вы создаете переменную экземпляра в объекте в CoffeeScript?


Обновление: Исправлена ​​опечатка в моем примере, поэтому методы на самом деле являются методами:)

Ответ 1

Тебе это не понравится. Чтобы указать ссылку :

Поскольку у вас нет прямого доступа к ключевому слову 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

Ответ 2

Просто добавьте в @Lauren ответ, что вы хотели, это в основном шаблон :

testObject = do ->

  message = null

  methodOne = ->
    message = "Foo!"

  methodTwo = ->
    alert message

  return {
    methodOne
    methodTwo
  }

Где message - это переменная "private", доступная только этим методам.

В зависимости от контекста вы также можете объявить сообщение перед объектом, чтобы оно было доступно для обоих методов (если выполнено в этом контексте):

message = null

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

Ответ 3

Вы можете определить свойство с помощью:

message: null

Но вы в настоящее время не определяете методы - вам нужно -> для этого.

Затем, чтобы ссылаться на свойства экземпляра внутри методов, префикс имен свойств @.

testObject = 

  message: null

  methodOne: ->
    @message = "Foo!"

  methodTwo: ->
    alert @message