Coffeescript类共享属性

时间:2013-10-14 06:50:26

标签: 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中。

1 个答案:

答案 0 :(得分: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)
相关问题