为什么在以下JavaScript中未定义bar?

时间:2013-11-18 22:03:53

标签: javascript coffeescript

我正在玩CoffeeScript和'class'关键字,结果如下:

var Foo, foobar;

Foo = (function() {
  function Foo() {}

  Foo.bar = 7;

  return Foo;

})();

foobar = new Foo;

alert(foobar.bar);
输入后输入

class Foo
  @bar = 7


foobar = new Foo

alert foobar.bar

我希望bar能够保留该值,但警告会弹出undefined

2 个答案:

答案 0 :(得分:2)

barFoo(函数)的属性,而不是它创建的实例。

如果你想在实例bar,你有两个选择:

  1. 在构造函数中设置它:

    class Foo
      constructor: () ->
        @bar = 7
    
    foobar = new Foo
    
    alert foobar.bar
    

    哪个转换为此JavaScript:

    var Foo, foobar;
    
    Foo = (function() {
      function Foo() {
        this.bar = 7;
      }
    
      return Foo;
    
    })();
    
    foobar = new Foo;
    
    alert(foobar.bar);
    
  2. 或者将其设置在原型上:

    class Foo
      bar: 7
    
    foobar = new Foo
    
    alert foobar.bar
    

    转换为:

    var Foo, foobar;
    
    Foo = (function() {
      function Foo() {}
    
      Foo.prototype.bar = 7;
    
      return Foo;
    
    })();
    
    foobar = new Foo;
    
    alert(foobar.bar);
    

答案 1 :(得分:1)

试试这个:

class Foo
  constructor: ->
    @bar = 7

foobar = new Foo()
alert foobar.bar

问题在于,当您在班级@时指的是Foo。所以在你的示例Foo.bar == 7中,它没有在实例上设置任何东西(你可以在构造函数中做)。