2013-11-18 4 views
0

Я играю с CoffeeScript и ключевым словом «класса», в конечном итоге со следующим:Почему бар не определен в следующем JavaScript?

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 

I рода ожидаемого бара, чтобы сохранить это значение, но alert появляется как undefined

+0

Если вас интересуют функции прототипа JavaScript и функции конструктора в JavaScript, я написал введение здесь: http://stackoverflow.com/a/16063711/1641941 Почему значение Foo предоставляется IIFE, потому что вы возможно, захотят использовать значения закрытия. В этом случае он избыточен, потому что у вас его нет. – HMR

ответ

2

bar - свойство Foo (функция), а не экземпляры, которые он создает.

Если вы хотите 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); 
    
+0

oh duh ... Мне нужно использовать 'this' вместо этого? ... нет, что не сработало ни – BigOmega

+0

Нет: что вам нужно, это исправление Javascript. Если bar является свойством Foo, он будет доступен как 'Foo.bar' –

+0

@GeorgeJempty: Я считаю, что он ищет синтаксис CoffeeScript. –

1

Попробуйте это:

class Foo 
    constructor: -> 
    @bar = 7 

foobar = new Foo() 
alert foobar.bar 

Проблема заключается в том, что, когда вы находитесь на уровне класса @ относится к Foo. Итак, в вашем примере Foo.bar == 7, но он ничего не устанавливает на экземплярах (что вы можете сделать в конструкторе).

Смежные вопросы