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 回答