2016-03-23 13 views
0

に、私は無名関数で@キーワードのスコープを持ついくつかの問題CoffeeScriptの範囲クラス

(これは何が起こっているかではなく、私は私の例のためにそれを必要とする)

​​3210 を持っています

これは、例えばwindowにクラス

class Example 
    stuff: [] 
    otherStuff: createArray -> 
     @stuff 

@点(私は推測)です。そこで私はこれを調べ、fat arrowを思い出してジェネレータ関数を作成しました。

私はこの

class Example 
    stuff: [] 
    otherStuff: createArray => 
     @stuff 

を試みたが、それもfunction(_this) { ...}(this)にコンパイルされませんでした。だから、私はすべての発電機でラップしようとし始めた

class Example 
    stuff: [] 
    otherStuff: => 
     createArray -> 
      @stuff 

... 
    otherStuff: => 
     stuff = @stuff 
     createArray -> 
      stuff 
... 
    otherStuff: ((stuff) -> 
     createArray -> 
      stuff 
    )(@stuff) #this is the one that upsets me the most because it compiles to Example.stuff and not to Example.prototype.stuff 

しかし、これらのどれも動作していません。

classの代わりに単純なfunctionに切り替える前に、私が欲しいものを達成する方法はありますか?

答えて

1
otherStuff: createArray -> 
    @stuff 

これは、クラス定義時でを実行し、ないときは、otherStuff()を実行しています。その時点ではオブジェクトはまだインスタンス化されていないので、this@)はありません。基本的にこれはやっている:

Example.prototype.otherStuff = (function() { return this.stuff; })(); 
// which boils down to: 
Example.prototype.otherStuff = this.stuff; 

もちろん、thisはこの時点でExampleのインスタンスとは何の関係もありません。

あなたは@Exampleの現在のインスタンスを参照したい場合は、あなたがインスタンスを持ってまで、あなたの関数の実行を延期し、otherStuffを呼び出す必要があります。ここでは

otherStuff: -> 
    createArray -> 
     @stuff 

今内部関数はそのコンテキストを失うことになります、そしてあなたがそれをバインド脂肪の矢印に必要があります。

otherStuff: -> 
    createArray => 
     @stuff 
+0

は、私はクラスの作成時に '@ otherStuff'にバインド' createArray'の結果をしたい、それは私が自己実行中の関数を作成しようとしていた理由です。 – fra9001

+1

さて、クラスの作成時に、まだ「これ」はありません。だから...いくらか不可能です。 – deceze