2012-02-27 1 views
2
class @A 
    A_Function_Alias: => @my_function 

    my_function: => 

    usage_of_alias: => 
     @A_Function_Alias.call() 

Что я хочу, это usage_of_alias бытьПоля в CoffeeScript?

usage_of_alias: => @A_Function_Alias ​​

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

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

event: => new Event(@my_function) 

которая доступна как event.call().hi()

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

Что-то, что ведет себя больше похоже на поле вместо свойства.

+0

Я не совсем уверен, что понимаю, чего вы пытаетесь достичь. Скорее, почему, если бы вы могли опубликовать некоторый код, возможно, что-то большее, чем конкретное доменное я уверен, что мы могли бы помочь решить вашу проблему. Вы не должны использовать 'eval', это точно. –

+0

Является ли 'usage_of_alias: @ A_Function_Alias', что вы хотите? Его непонятно, для чего вы собираетесь. –

+0

Я просто не хочу использовать .call(). Значение для этого чисто косметическое. Кажется, что связанные функции не могут указывать на другие связанные функции, если только они не являются связанными функциями. –

ответ

2

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

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

    A_Function_Alias: @::my_function 

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

See what this compiles to here.

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

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


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

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 
+0

Это выглядит действительно хорошо, спасибо. Я понимаю ваше предложение об альтернативе. Мне нужно пространство имен для событий, чтобы я мог использовать jQuery 1.7 для включения и выключения api. Поскольку у меня нет отражения в CoffeScript, чтобы использовать имя метода в качестве пространства имен, я создаю оболочку для своего события. Это выглядит так: 'event: => new Event (« Class.method », @method)' Я хочу связать событие, просто передав событие, а не event.call() в мой просмотр.Я также не хочу встроить мое создание событий, чтобы было легче протестировать его без использования EventFactory или реализации Event.equals(). –

+0

Ahh. с этим подходом возникает связанная проблема. Надеюсь, у меня будет больше информации. –

+0

Хорошо, это все потому, что мне не хватало заявления о требовании, которое провело меня через все это испытание. –

Смежные вопросы