7

変数とオブジェクトの 2 つのプロパティを持つサンプル クラスがあります。

var Animal, a, b;

Animal = (function() {
  function Animal() {}

  Animal.prototype.priceb = 4;

  Animal.prototype.price = {
    test: 4
  };

  Animal.prototype.increasePrice = function() {
    this.price.test++;
    return this.priceb++;
  };

  return Animal;

})();

a = new Animal();

console.log(a.price.test, a.priceb); // 4,4
b = new Animal();
console.log(b.price.test, b.priceb); // 4,4
b.increasePrice();
console.log(b.price.test, b.priceb); // 5,5
console.log(a.price.test, a.priceb); // 5,4 !! not what I would expect. Why not 4,4?

どういうわけか、これは奇妙な動作をしているようです。クラスがオブジェクトへの参照を格納しているように見えるため、複数のインスタンスで共有されます。

どうすればそれを防ぐことができますか?

4

1 に答える 1

7

プロトタイプにあるオブジェクト (参照) は、オブジェクトの内容ではなく、参照自体が変更されるまで、実際にインスタンス間で共有されます。

これを回避する方法は、コンストラクター内で各オブジェクトに独自の.priceプロパティを与えることです。

function Animal() {
    this.price = { test: 4 };
}

で指定した (デフォルトの) プリミティブ値Animal.prototype.priceb、最初はインスタンス間で共有されますが、変更するとすぐに、インスタンスはプロトタイプから元の値をシャドウする独自のコピーを取得します。

于 2013-06-13T13:46:47.937 に答える