0

関数の結果がプロトタイプスロットに割り当てられる前に、中間関数によってアドバイスされるメソッドを宣言する次のコードがあります。

class A
    somemethod: advise => @dosomething()

この場合、太い矢印がインスタンスにバインドされないのはなぜですか?

4

1 に答える 1

0

簡単な答え

プロトタイプ スロット名と関数定義の間に仲介者を配置すると、CS がコンストラクターでバインド コードを発行する構文パターンが壊れます。

class A
    foo: (paramlist) =>
    bar: ()=>
    baz: =>

これらすべてのメソッド定義は、生成された Javascript コンストラクターでこのコードを発行します

function A() {
    this.foo = __bind(this.foo, this);
    this.bar = __bind(this.bar, this);
    this.baz = __bind(this.baz, this);
}

間に何かを入れると、Coffeescript コンパイラーがそのパターンを認識して必要なコードを生成できる構文パターンを破ることになります。

class A
    helpWhereIsMyMethod: processTheFollowing => @doSomething()

この場合、コンストラクターでのバインド呼び出しは生成されません

より複雑な答え

プロトタイプ スロット (名前) を定義し、すぐに (無名の) 関数を割り当てると、後でその関数にアクセスして「処理」または呼び出すことができるハンドルが効果的に作成されます (ほとんどの場合)。

結果をプロトタイプ スロットにバインドする前に関数を別の関数 (仲介) にパイプすると、後でアクセスできない無名関数が効果的に作成されます。

そのため、Coffeescript コンパイラーはコンストラクターでバインド コードを発行する方法を知りません。これは、オブジェクトの作成時に無名関数へのアクセスが許可されなくなるためです。

また、中間関数は独自のコードを生成し、この新しいコードを発行してプロトタイプ スロットにバインドすることもできます。

于 2012-11-02T05:02:40.540 に答える