すべてのインスタンスには、作成に使用されたコンストラクターのプロトタイプへのリンクがあります。したがって、すべてのインスタンスがプロトタイプ メンバーを共有します。共有プロトタイプ メンバーへの変更が 1 つのインスタンスで行われると、他のすべてのインスタンスに反映されます。以下に示すように、これがプリミティブ型で機能しないように見える理由:
//creating an empty object type
function OBJTYPE(){};
//adding primitive value and reference value as a memeber to
//the prototype of the object type
OBJTYPE.prototype.value = 0;
OBJTYPE.prototype.arr = ["red","green","blue"];
//creating instances of the object type
var obj1 = new OBJTYPE();
var obj2 = new OBJTYPE();
//outputting the prototype members through both the instances
document.write(obj1.value + "<br />"); //0
document.write(obj2.value + "<br />"); //0
document.write(obj1.arr + "<br />"); //red,green,blue
document.write(obj2.arr + "<br />"); //red,green,blue
//changing value of primitive member
obj1.value = 1; //creates a new instance property
//modifying the reference type member - pushing a value on the array
obj1.arr.push("black"); //modifies the prototype property
//outputting the prototype members through both the instances
document.write(obj1.value + "<br />"); //1 //.value from instance
document.write(obj1.__proto__.value + "<br />"); //0 //.value from prototype
//works in Firefox, Safari, and Chrome
document.write(obj2.value + "<br />"); //0 //.value from prototype
document.write(obj1.arr + "<br />"); //red,green,blue,black
document.write(obj2.arr + "<br />"); //red,green,blue,black
上記のように、プリミティブ メンバーの値を変更すると、プロトタイプで同じ名前のプロパティを上書きする代わりに、value
onという名前の新しいインスタンス プロパティが作成されます。obj1
したがって、プロパティにアクセスするobj1.value
と、プロトタイプ プロパティをマスクするインスタンス プロパティが返されます。そのため、2 つのインスタンス インスタンスは の異なる値を示しますvalue
。
ただし、これは参照型ではなく、上からわかるように同様に動作しません。なんで?