我在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中。
答案 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)