0
class Foo 
  bar: "hello"
  biz:
    bang: ()=> alert @bar
foo = new Foo()

にコンパイルします

var Foo, foo;

Foo = (function() {
  var _this = this;

  function Foo() {}

  Foo.prototype.bar = 'hello';

  Foo.prototype.biz = {
    bang: function() {
      return alert(Foo.bar);
    }
  };

  return Foo;

}).call(this);

foo = new Foo();

alert(Foo.bar);主に、これがインスタンスへの参照ではなくコンパイルされるのはなぜですか?

4

2 に答える 2

2

=>の代わりに使用しているため、クラスへの参照でコンパイルされます->。関数の を関数の外側に=>バインドします。クラス関数の場合、関数の外側はクラス自体です。@@@bang

を使用すると、関数内で関数がどのように呼び出されるかに依存->することを意味するため、呼び出すと. あなたが試みているようにネストされたオブジェクトを持つことは、一般的に混乱を招きます。そうしようとしている理由はありますか?ここでの正しい答えは、あなたのようにネストしないこと、またはどこでも明示的に行うことだと思います。これは非常に醜いでしょう。@instance.biz.bang()alert(biz.bar)instance.biz.bang.call(instance)

于 2013-10-26T19:39:01.847 に答える
1

必要に応じてメソッドに名前を付けることができます。適切な場所でそれを行う必要があるだけなので、それ@が期待どおりになります。例えば:

class Foo 
  bar: "hello"
  constructor: ->
    @biz =
      bang: => console.log @bar
foo = new Foo
foo.biz.bang() # 'Hello' in the console.
f = foo.biz.bang
f()            # Also 'Hello' in the console.

デモ

コンストラクター内で使用する必要があることに注意してください。bang: => ...@bang

于 2013-10-26T20:04:32.730 に答える