プロトタイプチェインを辿ることで、親オブジェクトのプロパティにアクセスできる一方で、プロパティの変更も親オブジェクトに影響を与える可能性があります。そのため、プロトタイプチェインに沿ってプロパティを変更する場合には、意図しない副作用が起こらないように注意が必要です。プリミティブ[編集]JavaScriptにおいて、プリミティブとは、単純なデータ型のことを指します。以下はJavaScriptにおけるプリミティブの種類です。(symbol)これらのデータ型は、それ自体がオブジェクトではなく、単純な値そのものであるため、プリミティブと呼ばれます[1]。world!"は文字列のプリミティブ値であり、42は数値のプリミティブ値です。あるため、変更することができません。プリミティブは、オブジェクトとは異なり、メソッドを持ちません。world!"は文字列のプリミティブ値であるため、メソッドを持っていません。Stringオブジェクトは、文字列に対して多くの便利なメソッドを提供しています。プリミティブ値は、JavaScriptにおいて非常に重要な役割を果たしています。JavaScriptにおけるすべての値は、プリミティブ値かオブジェクトのいずれかであり、JavaScriptの多くの機能がこれらの値を基に構築されています。ボックス化[編集]ここまで読んで少しおかしいと思った人がいるかも知れません。"Hello"について考えてみましょう。length(長さ)というプロパティを表示してみます(プリミティブはプロパティを持たないはず)。何事もなく長さが表示されました。これは、プリミティブのプロパティを参照するとプリミティブに対応したラッパーオブジェクト(この場合はStringオブジェクト)がプリミティブの値をコンストラクタのパラメータとして生成され、生成されたラッパーオブジェクトのプロパティが参照されるからです。String("Hello")).length);に相当することが自動的に行われます。プログラミングでプリミティブとラッパーオブジェクトの違いを意識する事は稀ですが、両者は明確に異なります(例えば、eval()関数に文字列を渡すと評価されStringオブジェクトを渡すと文字列がかえります)。以下が、JavaScriptにおけるプリミティブ値とその対応するラッパーオブジェクトの一覧表です。Symbolラッパーオブジェクトは、プリミティブ値をラップすることで、それに対してメソッドやプロパティを提供します。プリミティブ値は暗黙的にラッパーオブジェクトに変換されるため、ラッパーオブジェクトを意識する必要がない場合もあります。2020から導入されたプリミティブ型の1つです。BigIntは、整数値の範囲を超えるような大きな数値を表現するために使われます。ラッパーオブジェクトはBigIntです。構文[編集]もっとも単純なオブジェクトは次のような形をしています。14};プロパティアクセサ[編集]オブジェクトにドット記法またはブラケット記法でキーの文字列を指定すると対応する値を取り出すことができます。array)といいます。呼ばれます(プロパティキーをプロパティと言いがちです)。JavaScriptにおいてオブジェクトは連想配列です[2]。Stringオブジェクトのlengthプロパティというのは、まさにStringという連想配列のprototypeプロパティのlengthプロパティのことを指しています。プロパティのキーは通常識別子で数値を指定すると文字列に変換されます。["10"]また、プロパティのキーにシンボルをとることも出来ます。プロパティの値には数値や文字列だけでなく関数などあらゆるオブジェクトとプリミティブをとることができます。Objectオブジェクト[編集]Objectオブジェクトは、JavaScriptの中心的なオブジェクトの一つであり、他の全てのオブジェクトの親であるため、JavaScriptで最も基本的なオブジェクトの1つです。Objectオブジェクトには、以下のような機能があります。プロパティ:オブジェクトが持つ情報(値)を表します。メソッド:オブジェクトで実行できる操作を表します。コンストラクタ:新しいオブジェクトを作成するための関数です。JavaScriptの全てのオブジェクトは、Objectオブジェクトを継承しているため、Objectオブジェクトが持つプロパティやメソッドを利用することができます。Object.keys()メソッドは、与えられたオブジェクトの全てのキーを配列として返すメソッドです。Objectオブジェクトは、JavaScriptでのオブジェクト指向プログラミングにおいて、非常に重要な役割を果たしています。null、undefinedも、実際にはObjectオブジェクトであるため、JavaScriptにおける全てのデータは、最終的にObjectオブジェクトに帰着するということができます。「Object」も参照プロパティ[編集]Object.prototypeObjectプロトタイプオブジェクト静的メソッド[編集]JavaScriptには、クラス(ES6から導入)ではなく、オブジェクト指向のプロトタイプベースの言語であるため、静的メソッドという概念はありません。グローバルオブジェクトやネイティブオブジェクト(Array、Math、String、Objectなど)には、クラスメソッドと呼ばれる、そのオブジェクト自体に関連する静的メソッドが存在します[3]。以下に、JavaScriptでよく使われるグローバルオブジェクトやネイティブオブジェクトに存在する静的メソッドの一部を挙げます。配列風のオブジェクトから、配列を生成します。引数が配列かどうかを判定します。1つ以上のオブジェクトのプロパティを、別のオブジェクトにコピーします。オブジェクトの全てのキーを配列として取得します。引数の絶対値を返します。引数の中で最大値を返します。Unicode値に対応する文字列を返します。文字列を整数に変換します。これらの静的メソッドは、それぞれのオブジェクトに対して呼び出すのではなく、オブジェクト名(グローバルオブジェクトの場合は、window)とメソッド名をドットで繋いで呼び出します。Array.from()やMath.max()などです。Object.assign()1つまたは複数のソース・オブジェクトからターゲット・オブジェクトに、列挙可能なすべての自己プロパティの値をコピーします。Object.create()Object.defineProperties()オブジェクトに複数のプロパティを定義します。Object.defineProperty()オブジェクトにプロパティを定義します。ペアを配列で返します。Object.freeze()プロパティを全て凍結しますObject.fromEntries()Object.getOwnPropertyDescriptors()オブジェクトの複数のプロパティ記述子を返します。Object.getOwnPropertyDescriptor()オブジェクトのプロパティ記述子を返します。Object.getOwnPropertyNames()Object.getOwnPropertySymbols()Object.getPrototypeOf()オブジェクトのプロトタイプを返します。Object.isExtensible()Object.isFrozen()Object.isSealed()Object.is()Object.keys()オブジェクトの列挙可能なすべてのプロパティを配列で返します。}}console.log(a.sort().join("\n"));アクセサプロパティ[編集]JavaScriptのアクセサプロパティは、オブジェクトのプロパティを操作するための方法の1つで、getとsetの2つの特別な関数を使用します。アクセサプロパティは、プロパティの値を直接操作するのではなく、get関数とset関数を介して値を取得または設定することができます[4]。以下は、アクセサプロパティを使用したオブジェクトの例です。前置したメソッドを定義すると、メソッド名が仮想のプロパティ名になります。"Smith"上記の例では、personオブジェクトに、firstNameとlastNameの2つの通常のプロパティと、fullNameというアクセサプロパティがあります。fullNameプロパティは、get関数を使用して取得され、set関数を使用して設定されます。fullNameプロパティを介して、firstNameとlastNameプロパティを変更することができます。アクセサプロパティを使用することで、プロパティにアクセスする際に、通常のプロパティのように値を直接取得するのではなく、関数を介して複雑な計算を行うことができます。プロパティの設定時に、値の妥当性をチェックするなど、値に対する制限を設けることができます。[[Get]]と[[Set]]を操作する方法[編集]JavaScriptにおけるアクセサプロパティは、オブジェクトのプロパティを取得および設定するための機能で、Object.defineProperty()メソッドを使用して定義されます。このメソッドを使用することで、プロパティの[[Get]]および[[Set]]内部メソッドを定義できます[5]。以下は、Object.defineProperty()メソッドを使用したアクセサプロパティの例です。"Smith"上記の例では、personオブジェクトにfullNameプロパティを定義し、getおよびsetメソッドを使用して値を取得および設定します。fullNameプロパティが呼び出されると、getメソッドが呼び出され、fullNameの値が返されます。fullNameプロパティに値を設定すると、setメソッドが呼び出され、フルネームを分割して、firstNameとlastNameプロパティを設定し、fullNameの値を更新します。このように、Object.defineProperty()メソッドを使用すると、オブジェクトのプロパティに対して、getおよびsetメソッドを定義することができます。この方法を使用すると、プロパティの取得と設定に関する制御を細かく設定することができます。getterやsetterを定義できませんでしたが、[[Get]]と[[Set]]を操作する方法であれば生成後も追加・変更が可能です。1.77;console.log(`${l.m}メートルは、${l.cm}センチメートルで${l.mm}ミリメートルです。`)「1.77メートルは、177センチメートルで1770ミリメートルです。オブジェクトの拡張[編集]NumberやString、Array、Objectなどの標準グローバルオブジェクトにプロパティを追加したり、既存のメソッドをオーバーライドしたりしてこれらのオブジェクトを拡張することができます。区切って表示してみましょう。使うべきだったかも)。Arrayオブジェクトのメソッドが使われているが、他のオブジェクトでもメソッドチェーンを作ることは出来ます。非メソッドチェーン版とメソッドチェーン版を比較すると変数の数がメソッドチェーン版では減っている事にきがつくとおもいます。this)になります。挟んで左から右にメソッドが次々と評価されます。この連鎖構造を鎖に例えてメソッドチェーンと呼ばれます。メソッドチェーン節の演習問題[編集]非メソッドチェーン版とメソッドチェーン版を比較すると出力に小さな違いがあります。その原因をしらべ結果を揃えるようコードを改修してみましょう(どちらに合わせても構わないです)。連想配列専用オブジェクトとしてMapとWeakMapがあります。あり単なる連想配列として扱うと混乱が生じるためです。MapとWeakMapのキーは全てのオブジェクトとプリミティブが使えますが、Objectオブジェクトのプロパティキーには文字列かSymbolしか使えません。Objectsこのページ「JavaScript/オブジェクト」は、まだ書きかけです。加筆・訂正など、協力いただける皆様の編集を心からお待ちしております。ご意見などがありましたら、お気軽にトークページへどうぞ。表示-継承ライセンスのもとで利用できます。追加の条件が適用される場合があります。詳細については利用規約を参照してください。統計Cookieに関する。