●JavaScriptのプロパティとは?
皆さん、JavaScriptを学び始めたばかりの頃って、オブジェクトやプロパティという言葉に戸惑ったりしませんでしたか?
私も最初は「プロパティって何だろう?」と思ったものです。
今日はそんなプロパティについて、一緒に理解を深めていきましょう。
JavaScriptにおいて、プロパティとはオブジェクトに関連付けられた変数のことを指します。
オブジェクトは、複数のプロパティを持つことができ、それぞれのプロパティには値が格納されています。
○プロパティの基本概念
プロパティは、名前(キー)と値(バリュー)のペアで構成されています。
オブジェクトは、これらのプロパティを持つことで、様々なデータを表現することができるんです。
プロパティの名前は文字列で指定し、値には数値、文字列、真偽値、オブジェクト、配列など、様々な型のデータを格納できます。
オブジェクトのプロパティは、ドット記法やブラケット記法を使ってアクセスしたり、操作したりすることができます。
○プロパティとオブジェクトの関係
オブジェクトは、関連するデータや機能をまとめるためのデータ構造です。
それぞれのオブジェクトは、プロパティを通じて状態を保持し、メソッドを通じて振る舞いを提供します。
プロパティは、オブジェクトの特性や属性を表現するために使用されます。
例えば、人を表現するオブジェクトであれば、「名前」、「年齢」、「住所」などのプロパティを持つことができます。
○サンプルコード1:プロパティの宣言と値の設定
それでは、実際にコードを見ながらプロパティの宣言と値の設定について理解を深めていきましょう。
上記のコードでは、personオブジェクトを作成し、name、age、addressという3つのプロパティを宣言しています。
それぞれのプロパティには、"山田太郎"、25、"東京都"という値が設定されています。
オブジェクトのプロパティにアクセスするには、オブジェクト名の後にドット(.)を続け、プロパティ名を指定します。
console.log()を使って、それぞれのプロパティの値を出力すると、設定した値が表示されます。
実行結果
このように、プロパティを通じてオブジェクトにデータを格納し、そのデータにアクセスすることができます。
プロパティは、JavaScriptにおいてオブジェクトの状態を表現するための重要な概念なんですね。
●ドット記法でのプロパティ値取得
さて、オブジェクトのプロパティに格納された値を取得するには、どうすればいいでしょうか?
最も一般的な方法は、ドット記法を使うことです。
ドット記法を使えば、プロパティ名を指定して、そのプロパティの値にアクセスできます。
○ドット記法の構文
ドット記法の構文は、とてもシンプルです。
オブジェクト名の後にドット(.)を置き、続けてプロパティ名を指定します。
例えば、personオブジェクトのnameプロパティにアクセスするには、person.nameと記述します。
○サンプルコード2:ドット記法の使用例
それでは、実際にドット記法を使ってプロパティの値を取得してみましょう。
上記のコードでは、bookオブジェクトを作成し、title、author、pages、publishedの4つのプロパティを定義しています。
それぞれのプロパティには、文字列、数値、真偽値が格納されています。
ドット記法を使って、book.title、book.author、book.pages、book.publishedとプロパティにアクセスすると、対応するプロパティの値が取得できます。
console.log()で出力すると、それぞれのプロパティの値が表示されます。
実行結果
ドット記法を使えば、このようにプロパティ名を指定するだけで、簡単にプロパティの値を取得することができるんです。
○ドット記法の注意点
ただし、ドット記法を使う際には、いくつか注意点があります。
プロパティ名が数字から始まる場合や、プロパティ名にハイフン(-)が含まれる場合は、ドット記法を使うことができません。
その場合は、ブラケット記法を使う必要があります(ブラケット記法については後ほど詳しく説明します)。
また、プロパティ名が変数で表される場合も、ドット記法では対応できません。
変数の値をプロパティ名として使用する場合は、ブラケット記法を使います。
例えば、次のようなコードはエラーになります。
first-nameやlast-nameのようにハイフンを含むプロパティ名は、ドット記法では正しく動作しません。
この場合は、ブラケット記法を使う必要があります。
●ブラケット記法でのプロパティ値取得
ドット記法でプロパティの値を取得する方法を学びましたが、JavaScriptにはもう一つ、ブラケット記法という方法があります。
ブラケット記法は、ドット記法では対応できない場合に役立ちます。
○ブラケット記法の構文
ブラケット記法の構文は、オブジェクト名の後に角括弧([])を置き、その中にプロパティ名を文字列として指定します。
プロパティ名を文字列として指定するため、ドット記法とは異なり、プロパティ名に数字や特殊文字が含まれていても問題ありません。
○サンプルコード3:ブラケット記法の使用例
それでは、ブラケット記法を使ってプロパティの値を取得する例を見てみましょう。
上記のコードでは、studentオブジェクトを作成し、name、age、student-id、favorite subjectの4つのプロパティを定義しています。
student-idのようにハイフンを含むプロパティ名や、favorite subjectのように空白を含むプロパティ名も、ブラケット記法を使えば問題なく指定できます。
ブラケット記法でstudent["name"]、student["age"]、student["student-id"]、student["favorite subject"]とプロパティにアクセスすると、それぞれのプロパティの値が取得できます。
console.log()で出力すると、対応するプロパティの値が表示されます。
実行結果
このように、ブラケット記法を使えば、ドット記法では扱えないプロパティ名でも、プロパティの値を取得することができます。
○ブラケット記法の利点
ブラケット記法の大きな利点は、プロパティ名を動的に指定できることです。
プロパティ名を変数で表すことができるため、プロパティ名が動的に決まる場合に便利です。
例えば、次のようなコードを見てみましょう。
上記のコードでは、propertyName変数に"age"という文字列を代入しています。
そして、personオブジェクトのageプロパティにアクセスする際に、person[propertyName]とブラケット記法を使っています。
この場合、propertyName変数の値である"age"がプロパティ名として扱われ、personオブジェクトのageプロパティの値である30が取得されます。
●オブジェクトの分割代入
JavaScriptのES2015(ES6)から導入された分割代入(Destructuring assignment)は、オブジェクトやプロパティの値を変数に代入するための便利な構文です。
分割代入を使うと、オブジェクトのプロパティを個別の変数に簡潔に代入できます。
○分割代入の構文
オブジェクトの分割代入の基本的な構文は次のようになります。
この構文では、オブジェクトから指定したプロパティを取り出し、対応する変数に代入します。
プロパティ名と変数名が同じ場合、プロパティ名: 変数名の形式で省略することができます。
○サンプルコード4:オブジェクトの分割代入
それでは、実際にオブジェクトの分割代入を使ってプロパティ値を取得してみましょう。
上記のコードでは、personオブジェクトを定義し、name、age、cityの3つのプロパティを持っています。
分割代入を使って、personオブジェクトからnameとageプロパティを取り出し、それぞれname変数とage変数に代入しています。
console.log()でname変数とage変数の値を出力すると、personオブジェクトの対応するプロパティの値が表示されます。
実行結果
このように、分割代入を使うことで、オブジェクトのプロパティを簡潔に変数に代入できます。
コードの可読性が向上し、変数の宣言と代入を一行で行うことができるんです。
○ネストしたオブジェクトの分割代入
分割代入は、ネストしたオブジェクトに対しても適用できます。
ネストしたオブジェクトとは、オブジェクトの中にオブジェクトが含まれている構造のことです。
例えば、次のようなネストしたオブジェクトがあるとします。
上記のコードでは、userオブジェクトの中にaddressオブジェクトがネストされています。
分割代入を使って、userオブジェクトからnameプロパティとaddressオブジェクトのcityプロパティを取り出しています。
address: { city }という構文で、addressオブジェクトからcityプロパティを取り出しています。
console.log()でname変数とcity変数の値を出力すると、userオブジェクトの対応するプロパティの値が表示されます。
実行結果
このように、分割代入を使えば、ネストしたオブジェクトからプロパティを取り出すこともできます。
複雑なオブジェクトの構造でも、必要なプロパティだけを簡潔に取得できるんですね。
●Object.valuesメソッド
JavaScriptのES2017(ES8)で導入されたObject.valuesメソッドは、オブジェクトが持つすべての列挙可能なプロパティの値を配列として返します。
このメソッドを使うと、オブジェクトのプロパティ値だけを簡単に取得できるんです。
○Object.valuesメソッドの構文
Object.valuesメソッドの構文は次のようになります。
Object.valuesメソッドは、引数にオブジェクトを受け取ります。
そして、そのオブジェクトの列挙可能なプロパティの値を要素とする新しい配列を返します。
○サンプルコード5:Object.valuesメソッドの使用例
それでは、Object.valuesメソッドを使って、オブジェクトのプロパティ値を取得してみましょう。
上記のコードでは、fruitsオブジェクトを定義し、apple、banana、orangeの3つのプロパティを持っています。それぞれのプロパティには、数値が格納されています。
Object.valuesメソッドを使って、fruitsオブジェクトのプロパティ値を取得し、values変数に代入しています。
console.log()でvalues変数の値を出力すると、fruitsオブジェクトのプロパティ値が配列として表示されます。
実行結果
このように、Object.valuesメソッドを使えば、オブジェクトのプロパティ値だけを簡単に配列として取得できます。
取得した配列に対して、forEachメソッドやその他の配列メソッドを適用することもできるんです。
例えば、次のようにプロパティ値の合計を求めることができます。
Object.valuesメソッドでfruitsオブジェクトのプロパティ値を配列として取得し、reduceメソッドを使って配列の要素を合計しています。
実行結果
このように、Object.valuesメソッドを使えば、オブジェクトのプロパティ値を配列として取得し、配列メソッドを適用することで、様々な処理を行うことができます。
●Object.entriesメソッド
Object.entriesメソッドは、Object.valuesメソッドと同じくES2017(ES8)で導入されたメソッドです。
このメソッドは、オブジェクトが持つすべての列挙可能なプロパティの名前と値のペアを配列として返します。
つまり、オブジェクトのプロパティ名と値を同時に取得できるんです。
○Object.entriesメソッドの構文
Object.entriesメソッドの構文は次のようになります。
Object.entriesメソッドは、引数にオブジェクトを受け取ります。
そして、そのオブジェクトの列挙可能なプロパティの名前と値のペアを要素とする新しい配列を返します。
各ペアは[プロパティ名, プロパティ値]の形式で表現されます。
○サンプルコード6:Object.entriesメソッドの使用例
それでは、Object.entriesメソッドを使って、オブジェクトのプロパティ名と値を取得してみましょう。
上記のコードでは、personオブジェクトを定義し、name、age、cityの3つのプロパティを持っています。
Object.entriesメソッドを使って、personオブジェクトのプロパティ名と値のペアを取得し、entries変数に代入しています。
console.log()でentries変数の値を出力すると、personオブジェクトのプロパティ名と値のペアが配列として表示されます。
各ペアは[プロパティ名, プロパティ値]の形式で表現されています。
実行結果
このように、Object.entriesメソッドを使えば、オブジェクトのプロパティ名と値を配列として取得できます。
取得した配列に対して、forEachメソッドやその他の配列メソッドを適用することで、プロパティ名と値を同時に扱うことができるんです。
例えば、次のようにプロパティ名と値を組み合わせて出力することができます。
Object.entriesメソッドでpersonオブジェクトのプロパティ名と値のペアを取得し、forEachメソッドを使ってそれぞれのペアに対して処理を行っています。
分割代入を使って、各ペアの要素をそれぞれkey変数とvalue変数に代入し、console.log()でプロパティ名と値を組み合わせて出力しています。
実行結果
このように、Object.entriesメソッドを使えば、オブジェクトのプロパティ名と値を同時に取得し、様々な処理を行うことができます。
プロパティ名と値を組み合わせて出力したり、条件に基づいてプロパティを絞り込んだりと、幅広い応用が可能です。
●forループでのプロパティ値取得
JavaScriptでは、forループを使ってオブジェクトのプロパティを走査し、プロパティ値を取得することができます。
forループは、指定された回数だけ処理を繰り返すための構文です。
○forループの構文
forループの基本的な構文は次のようになります。
初期化式では、ループ変数を初期化します。条件式では、ループを継続するための条件を指定します。
増減式では、ループ変数を更新します。
○サンプルコード7:forループでのプロパティ走査
それでは、forループを使ってオブジェクトのプロパティを走査し、プロパティ値を取得してみましょう。
上記のコードでは、carオブジェクトを定義し、brand、model、year、colorの4つのプロパティを持っています。
まず、Object.keys()メソッドを使って、carオブジェクトのプロパティ名を配列として取得し、keys変数に代入しています。
forループを使って、keys配列の要素を順番に取り出します。
ループ変数iを使って、keys配列のインデックスを表します。
条件式では、iがkeys配列の長さ未満である限りループを継続します。
ループ内では、keys[i]を使って現在のプロパティ名を取得し、key変数に代入します。
そして、car[key]を使って、carオブジェクトの対応するプロパティ値を取得し、value変数に代入します。
最後に、console.log()を使って、プロパティ名と値を組み合わせて出力します。
実行結果
このように、forループを使えば、オブジェクトのプロパティを順番に走査し、プロパティ値を取得することができます。
Object.keys()メソッドを使ってプロパティ名の配列を取得し、ループ変数を使ってプロパティ名とプロパティ値にアクセスしています。
ただし、forループを使う場合は、プロパティ名の配列を別途取得する必要があり、若干冗長な感じがしますよね。
次に紹介するfor...inループを使えば、より簡潔にプロパティを走査できます。
●for…inループでのプロパティ値取得
JavaScriptには、オブジェクトのプロパティを簡単に走査できるfor...inループという構文があります。
for...inループを使えば、オブジェクトのプロパティ名を順番に取得しながら、対応するプロパティ値にアクセスできます。
○for…inループの構文
for...inループの構文は次のようになります。
for...inループでは、オブジェクトのプロパティ名が順番に変数に代入されます。
そして、ループ内でその変数を使ってプロパティ値にアクセスできます。
○サンプルコード8:for…inループの使用例
それでは、for...inループを使ってオブジェクトのプロパティ値を取得してみましょう。
上記のコードでは、restaurantオブジェクトを定義し、name、location、rating、menuの4つのプロパティを持っています。
for...inループを使って、restaurantオブジェクトのプロパティを走査します。
ループ変数keyには、プロパティ名が順番に代入されます。
ループ内では、restaurant[key]を使って、現在のプロパティ名に対応するプロパティ値を取得し、value変数に代入します。
最後に、console.log()を使って、プロパティ名と値を組み合わせて出力します。
実行結果
このように、for...inループを使えば、オブジェクトのプロパティを簡単に走査し、プロパティ値を取得することができます。
プロパティ名を変数で受け取り、その変数を使ってプロパティ値にアクセスしているんですね。
ただし、for...inループを使う際には注意点があります。
for...inループは、オブジェクトの列挙可能なプロパティだけでなく、プロトタイプチェーン上のプロパティも走査対象に含まれます。
つまり、意図しないプロパティが含まれる可能性があるんです。
そのため、for...inループを使う場合は、hasOwnProperty()メソッドを使って、オブジェクト自身のプロパティかどうかを確認するのが一般的です。
hasOwnProperty()メソッドを使って、restaurantオブジェクト自身のプロパティかどうかを確認しています。
これにより、プロトタイプチェーン上のプロパティを除外できます。
for...inループは、オブジェクトのプロパティを簡単に走査できる便利な構文ですが、使い方には注意が必要ですね。
意図しないプロパティが含まれないように気をつけましょう。
●Object.getOwnPropertyNames
JavaScriptには、オブジェクトのプロパティ名を配列として取得するためのObject.getOwnPropertyNamesメソッドがあります。
このメソッドは、オブジェクト自身が持つ列挙可能な プロパティ名と列挙不可能なプロパティ名の両方を含む配列を返します。
○Object.getOwnPropertyNamesの構文
Object.getOwnPropertyNamesメソッドの構文は次のようになります。
Object.getOwnPropertyNamesメソッドは、引数にオブジェクトを受け取ります。
そして、そのオブジェクトが持つ列挙可能なプロパティ名と列挙不可能なプロパティ名を含む配列を返します。
○サンプルコード9:Object.getOwnPropertyNamesの使用例
それでは、Object.getOwnPropertyNamesメソッドを使ってオブジェクトのプロパティ名を取得してみましょう。
上記のコードでは、movieオブジェクトを定義し、title、director、yearの3つの列挙可能なプロパティを持っています。
また、Symbol("budget")というシンボルを使って、列挙不可能なプロパティも定義しています。
Object.getOwnPropertyNamesメソッドを使って、movieオブジェクトのプロパティ名を取得し、propertyNames変数に代入しています。
console.log()でpropertyNames変数の値を出力すると、movieオブジェクトの列挙可能なプロパティ名が配列として表示されます。
列挙不可能なプロパティ名は含まれていません。
実行結果
このように、Object.getOwnPropertyNamesメソッドを使えば、オブジェクトが持つ列挙可能なプロパティ名と列挙不可能なプロパティ名の両方を配列として取得できます。
ただし、Object.getOwnPropertyNamesメソッドは、シンボルを使って定義されたプロパティ名は含まれません。
シンボルのプロパティ名を取得するには、Object.getOwnPropertySymbolsメソッドを使う必要があります。
Object.getOwnPropertySymbolsメソッドを使って、movieオブジェクトのシンボルプロパティ名を取得し、symbolPropertyNames変数に代入しています。
console.log()でsymbolPropertyNames変数の値を出力すると、movieオブジェクトのシンボルプロパティ名が配列として表示されます。
実行結果
このように、Object.getOwnPropertyNamesメソッドとObject.getOwnPropertySymbolsメソッドを組み合わせることで、オブジェクトのすべてのプロパティ名を取得することができます。
●Reflectオブジェクトのメソッド
JavaScriptのES2015(ES6)から導入されたReflectオブジェクトは、オブジェクトに対する様々な操作を行うためのメソッドを提供しています。
Reflectオブジェクトのメソッドを使うことで、プロパティの取得、設定、削除などの操作を柔軟に行うことができるんです。
○Reflectオブジェクトの概要
Reflectオブジェクトは、つy¥技のようなメソッドを提供しています。
Reflect.get(target, propertyKey[, receiver]):オブジェクトのプロパティ値を取得しますReflect.set(target, propertyKey, value[, receiver]):オブジェクトのプロパティに値を設定しますReflect.has(target, propertyKey):オブジェクトが指定したプロパティを持っているかどうかを判定しますReflect.deleteProperty(target, propertyKey):オブジェクトのプロパティを削除しますReflect.ownKeys(target):オブジェクトが持つ全てのプロパティ名を配列として返します
これらのメソッドを使うことで、オブジェクトのプロパティに対する様々な操作を柔軟に行うことができます。
○サンプルコード10:Reflectメソッドの使用例
それでは、Reflectオブジェクトのメソッドを使ってプロパティ操作を行う例を見てみましょう。
上記のコードでは、userオブジェクトを定義し、name、age、emailの3つのプロパティを持っています。
Reflect.getメソッドを使って、userオブジェクトのnameプロパティの値を取得し、name変数に代入しています。
console.logでname変数の値を出力すると、"山田花子"が表示されます。
Reflect.setメソッドを使って、userオブジェクトのageプロパティの値を26に設定しています。
console.logでuser.ageの値を出力すると、26が表示されます。
Reflect.hasメソッドを使って、userオブジェクトがemailプロパティを持っているかどうかを判定しています。
console.logでhasEmail変数の値を出力すると、trueが表示されます。
Reflect.deletePropertyメソッドを使って、userオブジェクトのemailプロパティを削除しています。
console.logでuser.emailの値を出力すると、undefinedが表示されます。
Reflect.ownKeysメソッドを使って、userオブジェクトが持つ全てのプロパティ名を配列として取得しています。
console.logでkeys変数の値を出力すると、["name", "age"]が表示されます。
●よくあるエラーと対処法
JavaScriptでプロパティ値を取得する際、うっかりミスや思わぬ落とし穴にハマってしまうことがありますよね。
そんなときは、エラーメッセージを手がかりに原因を特定し、適切な対処を行うことが大切です。
○プロパティが未定義の場合
オブジェクトに存在しないプロパティにアクセスしようとすると、undefinedが返されます。
これは、プロパティが未定義であることを示しています。
上記のコードでは、personオブジェクトにemailプロパティが存在しないため、undefinedが出力されます。
このような場合は、プロパティの存在を確認してからアクセスするのが賢明です。
hasOwnPropertyメソッドを使って、プロパティの存在をチェックできます。
実行結果
hasOwnPropertyメソッドを使って、emailプロパティの存在を確認しています。
プロパティが存在しない場合は、適切なメッセージを出力するようにしています。
○プロパティ名のタイプミス
プロパティ名を記述する際に、タイプミスをしてしまうことがあります。
タイプミスをすると、意図しないプロパティにアクセスしてしまい、予期せぬ結果になることがあります。
上記のコードでは、titleプロパティのつもりが、titelとタイプミスしています。
その結果、undefinedが出力されます。
このようなミスを防ぐには、プロパティ名を注意深く記述することが大切です。
また、コード編集器の自動補完機能を活用するのも効果的です。
○オブジェクトがnullまたはundefinedの場合
オブジェクトがnullやundefinedの場合に、そのオブジェクトのプロパティにアクセスしようとすると、エラーが発生します。
上記のコードでは、user変数がnullになっています。
nullオブジェクトのプロパティにアクセスしようとすると、TypeErrorが発生します。
このようなエラーを避けるには、オブジェクトがnullやundefinedでないことを確認してからプロパティにアクセスする必要があります。
実行結果
user変数がnullやundefinedでないことを確認し、適切なメッセージを出力するようにしています。
●プロパティ値取得の応用例
JavaScriptでプロパティ値を取得する方法を学んできましたが、実際の開発現場では、もっと複雑なオブジェクトを扱うことが多いですよね。
ネストしたオブジェクトのプロパティにアクセスしたり、条件に基づいてプロパティを取得したりと、様々なシナリオが考えられます。
では、いくつかの応用例を見ていきましょう。
○サンプルコード11:ネストしたオブジェクトのプロパティ取得
オブジェクトの中にオブジェクトがネストしている場合、ドット記法やブラケット記法を組み合わせてプロパティにアクセスできます。
上記のコードでは、userオブジェクトの中にaddressオブジェクトがネストされています。
addressオブジェクトのプロパティにアクセスするために、ドット記法やブラケット記法を使っています。
user.address.cityでは、userオブジェクトのaddressプロパティにアクセスし、さらにaddressオブジェクトのcityプロパティにアクセスしています。
同様に、user.address["street"]では、ブラケット記法を使ってstreetプロパティにアクセスしています。
また、user["address"]["zipCode"]のように、ブラケット記法を連続して使うこともできます。
このように、ドット記法とブラケット記法を組み合わせることで、ネストしたオブジェクトのプロパティにアクセスできます。
○サンプルコード12:条件に基づくプロパティ値の取得
オブジェクトのプロパティ値を条件に基づいて取得したい場合があります。
その場合は、条件演算子(三項演算子)を使って、条件に応じて異なるプロパティ値を取得できます。
上記のコードでは、productオブジェクトにisSaleプロパティがあり、その値がtrueかfalseかによって、priceまたはsalePriceプロパティの値を取得しています。
条件演算子を使って、product.isSaleがtrueの場合はproduct.salePriceの値を、falseの場合はproduct.priceの値をprice変数に代入しています。
このように、条件演算子を使って、プロパティ値を条件に基づいて取得することができます。
○サンプルコード13:動的なプロパティ名の指定
プロパティ名を動的に指定する必要がある場合は、ブラケット記法を使って変数の値をプロパティ名として使用できます。
上記のコードでは、bookオブジェクトのプロパティ名をpropertyName変数に格納しています。
book[propertyName]のように、ブラケット記法の中で変数を使うことで、動的にプロパティ名を指定できます。
この場合、propertyName変数の値が"title"なので、book["title"]と同じ結果になります。
まとめ
さて、JavaScriptのプロパティについて、一緒に学んできましたが、いかがでしたか?
プロパティは、JavaScriptにおけるオブジェクト指向プログラミングの基礎となる概念です。
プロパティ操作の知識を深めることで、より効率的で柔軟なコードを書けるようになります。
今回学んだ内容を活かして、実務レベルのJavaScript開発スキルを身につけていきましょう。


