2

このコード

class Foo
  bar: []

test = new Foo()
test.bar.push('b')

test2 = new Foo()
console.log test2.bar

出力を生成します['b']。それはどのように可能ですか?

編集:

これは、CoffeScript が生成するものです。

// Generated by CoffeeScript 1.4.0
var Test, test, test2;

Test = (function() {
  function Test() {}
  Test.prototype.a = [];
  return Test;
})();

test = new Test();
test.a.push('b');

test2 = new Test();
console.log(test2.a);

したがって、以下に書かれていることはまさに真実です。君たちありがとう。

4

2 に答える 2

3

barに属する単一の配列インスタンスですFoo.prototype
new Foo().bar常にこの同じ配列インスタンスを参照します。

したがって、1 つのインスタンスで実行されたFoo変更は、他のFooインスタンスでも表示されます。

ソリューション:

プロトタイプにミュータブルな状態を置かないでください。

于 2013-06-07T14:07:59.780 に答える
0

Fooを で作成したい場合this.bar = []は、コンストラクターで行います。

class Foo
  constructor: -> @bar = []
于 2013-06-07T14:24:23.157 に答える