JavaScript では、ドット演算子「.」または括弧演算子「[]」を使用して、オブジェクトのプロパティを読み書きできます。
角括弧演算子を使用する場合、演算子の値の型は文字列、または文字列に変換できる式である必要があることに注意してください:
Java 言語とは異なり、JavaScript ではオブジェクトのプロパティを動的に追加または削除できます。プロパティに値を割り当てるときに、そのプロパティが存在しない場合、JavaScript はそのプロパティをオブジェクトに動的に追加します:
プロトタイプ継承チェーン内のプロパティの読み取り
JavaScript のすべてのオブジェクトにはプロトタイプ オブジェクトがあり、そのプロトタイプ オブジェクトからプロパティを継承するため、JS のオブジェクトのプロパティは 2 つの主要なカテゴリに分類されます。
1. オブジェクト自体が所有するプロパティ (「所有プロパティ」)。
2. プロトタイプ オブジェクトから継承されたプロパティ。
オブジェクトのプロパティを読み取る場合、従うルールは次のとおりです:
1. オブジェクト自身のプロパティ コレクション (「独自のプロパティ」) から読み取る必要があるプロパティを検索します。検索できる場合は、プロパティを直接読み取り、その値を返します。
2. オブジェクト独自のプロパティ コレクション (「独自プロパティ」) からプロパティを検索できない場合、プロパティが検索されてその値が返されるまで、オブジェクトのプロトタイプ チェーンから検索が続行されます。
3. オブジェクト自身のプロパティ コレクション (「独自プロパティ」)、またはオブジェクトのすべてのプロトタイプ オブジェクトからプロパティを検索できない場合は、unknown が返されます。
プロトタイプの継承チェーンでのプロパティの書き込み
JavaScript オブジェクトのプロパティに書き込む場合、従うルールは次のとおりです:
1. オブジェクト自体がプロパティを持ち、そのプロパティが書き込み可能な場合は、そのプロパティに新しい値を書き込みます。プロパティが読み取り専用の場合、エラーが報告されます。
2. オブジェクト自体にプロパティがなく、そのすべてのプロトタイプ オブジェクトにプロパティが存在しない場合は、オブジェクトにプロパティを追加します。
3. オブジェクト自体にプロパティがないが、そのプロパティがプロトタイプ オブジェクトに存在し、書き込み可能な場合、JS はオブジェクトに新しいプロパティを作成します。つまり、オブジェクトはプロトタイプ オブジェクトのプロパティを上書きします。プロトタイプ オブジェクト内のこのプロパティの値は変更されません。
4. オブジェクト自体にプロパティがないが、そのプロトタイプ オブジェクトにプロパティが存在し、読み取り専用である場合、エラーが報告されます。
5. オブジェクト自体にプロパティがなくても、そのプロトタイプ オブジェクトにプロパティの setter メソッドが存在する場合、JS はプロトタイプ オブジェクトの setter メソッドを呼び出します。 setter メソッドを実行するときに変数の代入が含まれる場合、代入操作はオブジェクト自体に作用し、プロトタイプ オブジェクトは一切変更されないことに注意してください。この動作は、オブジェクトがプロトタイプから setter 関数を継承し、それを実行すると理解できます。
上記のルールから、プロパティへの代入操作が成功した場合、最後に変更されるのは常にオブジェクト自体であり、そのプロトタイプのプロトタイプ オブジェクトには変更がないことがわかります。