以下のコードはhttp://bonsaiden.github.com/JavaScript-Garden/から取得したものです。
function Foo() {
this.value = 42;
}
Foo.prototype = {
method: function() {}
};
function Bar() {}
// Set Bar's prototype to a new instance of Foo
Bar.prototype = new Foo();
Bar.prototype.foo = 'Hello World';
// Make sure to list Bar as the actual constructor
Bar.prototype.constructor = Bar;
私はこの説明に何度も出くわしました。「オブジェクトのプロパティにアクセスするとき、最初にオブジェクト自体がそのプロパティを持っているかどうかをチェックし、そうでない場合はそのオブジェクトのプロトタイプに移動してプロパティを探します。」
しかし、次のコードの動作のために、これが実際にどのように機能するかを理解するのに苦労しています
var test1 = new Bar();
var test2 = new Bar();
test1.value = 24;
現在、valueはtest1オブジェクトの一部ではありませんが、Fooオブジェクトであるプロトタイプのプロパティです。プロトタイプはFooオブジェクトであるため、Barのすべてのインスタンスがvalueプロパティを共有します。上記のコードで期待されることは、そのvalueプロパティを24に設定しますが、代わりに'value'という名前の新しいプロパティをtest1オブジェクトに作成し、24割り当てて、プロトタイプのvalueプロパティを初期値42のままにします。これは共有のようには聞こえません。test2.valueの値はまだ42です。firebugコンソールでプロトタイプチェーンを見ると、test1には24の値プロパティがあり、そのプロトタイプには42の値プロパティがあることがわかります。
これは非常に混乱します。なぜこのように動作するのか理解した人はいますか?