我在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中,我以前从未遇到类似的问题.
将其转换为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)
| 归档时间: |
|
| 查看次数: |
56 次 |
| 最近记录: |