2

我在咖啡脚本中发现了一个非常奇怪的行为。

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中遇到过类似的问题。

4

1 回答 1

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)
于 2013-10-14T06:56:31.653 回答