2012-02-17 25 views
2
class A 
    constructor: -> 
    method: -> 

上記の例では、メソッドはクラスにバインドされず、どちらもコンストラクタではありません。は、バインドされた関数としてコンストラクタを定義できません。

class B 
    constructor: -> 
    method: => 

この場合、メソッドはクラスにバインドされます。これは、通常のオブジェクトメソッドが動作することを期待し、クラスBのすべてのフィールドにアクセスできるように動作します。しかし、コンストラクタはバインドされていませんか?それは奇妙に思える。だから私は以下を試した。

class C 
    constructor: => 
    method: => 

これはコンパイルされません。クラスにバインドされているすべてのメソッドで構文が同じになると思います。

私は - >演算子をstatic演算子、=>演算子をdynamic演算子と見なしたいと思います。しかし、それはあなたのようには思われません。できれば、 - >演算子を持つメソッドをsuperで呼び出すことができませんでした。しかし、実際には、あなたがすることができます。なぜこれはオブジェクト指向言語の構文には意味がありますか?これは、ほとんどのオブジェクト指向言語の継承ルールには同意しないようです。

答えて

4

コードのコンパイル方法を見てみましょう。 =>を使用すると、メソッドはコンストラクタ内でバインドされます。したがって、コンストラクタには=>を使用する意味がありません。バインドされるのはいつですか?

staticdynamicの演算子についてはわかりませんが、->演算子で定義されたメソッドをsuperと呼び出すことはできます。 ->=>の唯一の影響は、=>が呼び出される方法に関係なく、thisが問題のオブジェクトであることを保証することです。コメントの

概要:

->と動的対静的(または仮想)に類似=>の違いを呼び出すには、非常にそれらの演算子が何をするか伝えていません。それらはjavascriptのthis変数とは異なる動作をするために使用されます。たとえば、次のコードを見て:

class C 
    constructor: -> 
    method1: -> 
    console.log this 
    method2: => 
    console.log this 

c = new C() 

c.method1()  //prints c 
f = c.method1;f() //prints window 

c.method2()  //prints c 
f = c.method2;f() //prints c 

違いは、私たちは、各メソッドを呼び出す第二の方法である:メソッドは、オブジェクトに「バインド」でない場合は、そのthisが先行し何を見て、設定されていますメソッド呼び出し(.で区切られた)。最初のケースではcですが、2番目のケースではfがオブジェクトに対して呼び出されていないため、thiswindowに設定されています。 method2はオブジェクトにバインドされているため、この問題は発生しません。

通常、コンストラクタ関数は構築中のオブジェクトに自動的にバインドされていると考えることができます(したがって、=>とバインドすることはできません)。しかし、コンストラクタがオブジェクトを返す場合、それはコンストラクタの間にthisではなく、コンストラクタの戻り値になるため、これはまったく起こりません。

+0

staticとvs dynamicの違いは、静的メソッドはオーバーライドできませんが、動的メソッドは可能です。ダイナミックではなく、バーチャルと言うべきでしょうか? –

+0

私はこれらの概念のどちらかが ' - >'と '=>'の違いに対応しているとは思っていません。彼らはjavascriptの 'this'変数の不思議さに関係しています。 –

+0

ya、私はそれを得る。しかし、言語がjavascriptにコンパイルされているので、coffeescriptを直接評価することができます。これらの構文規則は意味がありますか? –

1

「=>」や太った矢印の意味については、大変混乱していると思います。

まず、あなたの例は実際に有効なcoffeescriptではありませんか?クラス宣言の後には->はありません。 1つを追加するのはコンパイラのエラーです。

「太い矢印」に戻って、私が考えることのできる静的および動的という用語にはマッピングがありません。代わりに太い矢印は、関数を呼び出しているオブジェクトへの参照を含むクロージャーで関数をラップするための便利な構文的砂糖です。

C++のアナログは、太い矢印が自動的にファンクタを作成する方法であると言います。オブジェクトを知らなくても呼び出すことができるサードパーティのコールバックとして関数を与えることができますが、内部で呼び出されたコードは、thisポインタとしてオブジェクトにアクセスできます。それは他の目的を果たすものではなく、関数が過負荷になるかどうか、またはスーパーにアクセスできるかどうかには関係しません。

+1

私は変更を加えました。次回は自分で作ってください。あなたはそれを得るでしょう。 :) –

+1

私は思いますが、私はまだ他の人のものを編集するのが不快であると感じています。 –

関連する問題