Поля в CoffeeScript? - PullRequest
       3

Поля в CoffeeScript?

2 голосов
/ 28 февраля 2012
class @A
   A_Function_Alias: => @my_function

   my_function: =>

   usage_of_alias: =>
      @A_Function_Alias.call()

То, что я хочу, это usage_of_alias, чтобы быть

use_of_alias: => @ A_Function_Alias ​​

И заставить его вести себя так же.т.е. я хочу более функциональный стиль синтаксиса здесь.Я пробовал несколько комбинаций без успеха.Меня беспокоит тот факт, что я должен оценить свою функцию, чтобы получить вкусности внутри.

Вместо этого было бы одно приложение:

event: => new Event(@my_function)

, к которому обращаются как event.call().hi()

У меня может быть другое объявление, которое позволит мне получить доступ к событию какevent.hi()

То, что ведет себя больше как поле, а не свойство.

1 Ответ

2 голосов
/ 28 февраля 2012

Я думаю, вы хотите это:

class @A
   my_function: => alert 'my function!'

   A_Function_Alias: @::my_function

   usage_of_alias: =>
      @A_Function_Alias()
      # some other code...

Посмотрите, к чему это относится, здесь.

При оценке класса @ - это объект конструктора класса, сам объект класса. А оператор :: позволяет углубиться в прототип. Таким образом, @::foo в теле класса компилируется в MyClass.prototype.foo.

Итак, сначала создается нормальный метод экземпляра с именем my_function, определенный в A.prototype.my_function. Затем мы создаем новый метод экземпляра с именем A_Function_Alias и напрямую назначаем функцию из прототипа объектов класса, который мы только что создали. Теперь my_function и A_Function_Alias указывают на один и тот же функциональный объект.


Но как более разумную альтернативу, могу ли я предложить шаблон, который определяет закрытую внутреннюю функцию, которую может использовать класс, а затем назначить ее более напрямую, без сумасшедшего доступа к прототипу?

class @A

  # Only code inside this class has access to this local function
  innerFunc = -> alert 'my function!'

  # Assign the inner funciton to any instance methods we want.
  my_function: innerFunc
  A_Function_Alias: innerFunc

  usage_of_alias: =>
    @A_Function_Alias()
    # or
    @my_function()
    # or
    innerFunc()
    # they all do the same thing
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...