Coffeescript类共享属性

M K*_*M K 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
Run Code Online (Sandbox Code Playgroud)

所以当你看到@list属性以一种奇怪的方式在两个类实例之间共享时.在coffeescript中,我以前从未遇到类似的问题.

Ble*_*der 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;

})();
Run Code Online (Sandbox Code Playgroud)

如您所见,Foo.prototype.list原型的属性,而不是类的实例.只有一个数组,它将在您班级的所有实例中共享.

要创建list实例变量,请将其添加到构造函数中:

class Foo
    constructor: ->
        @list = []

    add: (val)->
        @list.push(val)
Run Code Online (Sandbox Code Playgroud)