Переменная экземпляра 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
Ответ 4
Используйте @
для указания на this
testObject =
methodOne: ->
@message = "Foo!"
methodTwo: ->
alert @message
исправлена версия на coffeescript.org