2013-10-14 4 views
2

Я обнаружил очень странное поведение в coffeescript.Свойства класса класса Coffeescript

class Foo 
    list: [] 
    add: (val)-> 
     @list.push(val) 


x = new Foo() 
x.add(1) 
console.log(x.list.length) // 1 

y = new Foo() 
y.add(1) 
console.log(y.list.length) // 2 

Таким образом, как вы видите, свойство @list поделилось между двумя экземплярами класса странным образом. Я никогда не сталкивался с подобной проблемой раньше, в coffeescript.

ответ

5

Преобразование его в JavaScript:

var Foo, x, y; 

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

    Foo.prototype.list = []; 

    Foo.prototype.add = function(val) { 
    return this.list.push(val); 
    }; 

    return Foo; 

})(); 

Как вы можете видеть, Foo.prototype.list является собственностью прототипа, а не экземпляра вашего класса. Есть только один массив, и он будет доступен для всех экземпляров вашего класса.

Чтобы list переменную экземпляра, добавьте его в конструктор:

class Foo 
    constructor: -> 
     @list = [] 

    add: (val)-> 
     @list.push(val) 
+0

Да! Ты прав! Спасибо! –

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