割り当てるとき
c1.aString = 'a'
プロトタイプのフィールドに割り当てていません。aString
という名前の新しいフィールドがオブジェクトにaString
直接作成され、プロトタイプではフィールドが非表示になります。c1
aString
そんな中、電話すると
c1.anArray.push('a');
にはanArray
フィールドがないため、 in プロトタイプc1
を参照しています。anArray
これをテストするには、次のようにします。
c1.anArray = new Array();
anArray
また、新しいプロパティが で作成され、プロトタイプにc1
干渉していないことに注意してください。anArray
この場合、
console.log(c1.anArray);
console.log(c2.anArray);
まだプロトタイプ内c2
を参照しているため、異なる結果になります。anArray
オブジェクトとプロトタイプ (またはプロトタイプ チェーンのさらに先) の両方に同じ名前のフィールドがあり、このフィールドの値を要求した場合、インタプリタは最初にオブジェクトを直接調べてから、どこかでフィールドが見つかるまでプロトタイプチェーン。
ただし、フィールドに値を割り当てる場合は、常にオブジェクト内で直接行われ、プロトタイプでは行われません。