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

    my_function: => 

    usage_of_alias: => 
     @A_Function_Alias.call() 

usage_of_aliasCoffeeScriptのフィールドは?私が欲しいもの

usage_of_aliasになることです。=> @A_Function_Alias

そして、それは同じように動作しています。つまり、ここでもっと機能的なスタイルの構文が必要です。私は成功していない複数の組み合わせを試した。私の中のお菓子を得るために私の機能を評価しなければならないという事実が私を悩ませる。

1つの用途は、これに代えて次のようになります。event.call().hi()

としてアクセスされ

event: => new Event(@my_function) 

は私が私の振る舞い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.

クラス@を評価するクラスのコンストラクタのオブジェクト、クラスオブジェクトそのものです。 ::演算子を使用すると、プロトタイプをドリルインすることができます。そのため、クラス本体の@::fooMyClass.prototype.fooにコンパイルされます。

これはまず、という名前の通常のインスタンスメソッドを作成して、A.prototype.my_functionに定義します。次に、新しいインスタンスメソッドA_Function_Aliasを作成し、直前に作成したクラスオブジェクトのプロトタイプから関数を直接割り当てます。今度はmy_functionA_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 
+0

これは本当によかったよ、ありがとう。私は代替案に対するあなたの提案を理解しています。イベントのネームスペースが必要なので、jQuery 1.7のonとoffのAPIを使用できます。私はCoffeScriptでメソッド名を名前空間として使用することを反映していないので、私は自分のイベントのラッパーを作成しています。 'event:=> newイベント(" Class.method "、@メソッド)' event.call()の代わりにeventを私のViewに渡すだけでイベントをバインドしたいと思っています。また、EventFactoryを使用せずにテストすることやEvent.equals()を実装する方が簡単なように、イベントの作成をインライン化したくありません。 –

+0

ああ。このアプローチには拘束力のある問題があります。すぐに私はもっと多くの情報を持っています。 –

+0

これは私がこの試練の中に私を入れてくれるrequireステートメントがないためです。 –

関連する問題