@@ -8,7 +8,18 @@ import OpenInCodeSandbox from "@site/src/components/OpenInCodeSandbox";
88
99## クラスとインスタンス
1010
11- ** クラス** は、オブジェクトの設計図となるものです。次のコードでは、` name ` や ` age ` というプロパティを持つオブジェクトの設計図となるクラス ` Student ` を定義しています。
11+ オブジェクトを使うと、複数の値をひとまとまりに扱うことができました。実世界においては、同じ形(=同じプロパティを持つ)のオブジェクトを多く扱う場合が多いです。例えば、学生をオブジェクトとして表すことを考えてみましょう。学生にには必ず名前と年齢があるはずなので、ひとまず ` name ` と ` age ` をプロパティを持つとしましょう。
12+
13+ ``` javascript
14+ const tanaka = {
15+ name: " 田中" ,
16+ age: 18 ,
17+ };
18+ ```
19+
20+ 同じ形をしたオブジェクトを統一的に扱うための仕組みが ** クラス** です。クラスは、オブジェクトの設計図になります。
21+
22+ 次のコードでは、先ほど作った ` tanaka ` のように ` name ` や ` age ` というプロパティを持つオブジェクトの設計図として、クラス ` Student ` を定義しています。
1223
1324``` javascript
1425class Student {
@@ -27,9 +38,11 @@ class Student {
2738const tanaka = new Student (); // Student クラスをもとにオブジェクトを作成する
2839
2940tanaka .name = " 田中" ; // name プロパティに代入
30- document .write (tanaka .age ); // 18
41+ document .write (tanaka .age ); // age プロパティのデフォルト値は 18
3142```
3243
44+ ![ クラスとインスタンス] ( ./class-instance.png )
45+
3346:::tip ` undefined ` という値
3447上で定義した ` Student ` クラスには、デフォルト値の指定されていないプロパティ ` name ` が存在します。` new Student ` をした直後のオブジェクトの ` name ` プロパティの値はどうなっているのでしょうか。
3548
@@ -46,8 +59,11 @@ document.write(emptyFunction()); // 値を返さない関数の戻り値は unde
4659```
4760:::
4861
62+
4963## メソッド
5064
65+ 同じ形をしたオブジェクトに対しては、同じような処理を行うことが多いです。例えば、学生はたいてい最初の授業で自己紹介をします。
66+
5167オブジェクトに対して定義されている関数を** メソッド** と呼びます。メソッドの定義はクラス定義の中で行われますが、関数と異なり、` function ` キーワードを必要としません。
5268
5369``` javascript
@@ -57,27 +73,35 @@ class Student {
5773
5874 // メソッド introduceSelf を定義する
5975 introduceSelf () {
76+ // this は作成されたインスタンスを指す
6077 document .write (` 私の名前は${ this .name } です。${ this .age } 歳です。` );
6178 }
6279}
6380```
6481
65- メソッドを使用するには、プロパティへのアクセス時と同じく ` . ` (ドット)記号を用います。
82+ メソッド自体は単なる設計図でしかないため、実際のオブジェクトが存在するわけではありません。そこで、メソッド内では、設計図から作成されたインスタンス自身を指す特殊な変数 ` this ` が使用できます。
83+
84+ メソッドを使用するには、プロパティへのアクセス時と同じく、インスタンスに対して ` . ` (ドット)記号を用います。
6685
6786``` javascript
6887const tanaka = new Student ();
6988tanaka .name = " 田中" ;
7089tanaka .age = 18 ;
7190
91+ // introduceSelf メソッド内では this は tanaka に格納されたオブジェクトになる
7292tanaka .introduceSelf ();
7393```
7494
7595:::tip メソッドやプロパティの表記と ` prototype `
7696多くの言語で、クラス ` Class ` のメソッドやプロパティ ` method ` を、` # ` 記号を用いて ` Class#method ` と表記します。本資料では他言語の慣習に習い、この表記を用いるものとします。たとえば、上の例で定義されているメソッドは ` Student#introduceSelf ` メソッドです。
7797
78- ただし、JavaScriptにおいては ` prototype ` という語を用いて ` Class.prototype.method ` とされる場合があります。これはより厳密な表記です。外部の資料を読む場合は注意してください。
98+ ただし、JavaScript においては ` prototype ` という語を用いて ` Class.prototype.method ` とされる場合があります。これはより厳密な表記です。外部の資料を読む場合は注意してください。
7999:::
80100
101+ ### 課題
102+
103+ 自分自身の年齢を 1 増やすメソッド ` incrementAge ` を定義して、実行してみてください。
104+
81105## コンストラクタ
82106
83107** コンストラクタ** は、インスタンスを作成するタイミング(` new ` 演算子をクラスに適用するタイミング)で実行される特殊なメソッドです。コンストラクタとなるメソッドは ` constructor ` という名前で定義する必要があります。
@@ -143,9 +167,13 @@ const tanaka = new FreshmanStudent("田中", "18", "ドイツ語");
143167tanaka .introduceSelf (); // 私の名前は田中です。18歳です。ドイツ語選択です。
144168```
145169
170+ ### 課題
171+
172+ ` Student ` クラスを継承して ` SeniorStudent ` クラスを作ってみましょう。` SeniorStudent ` クラスのインスタンスは ` researchQuestion ` プロパティを持ち、` introduceSelf ` メソッドを実行すると自分の名前を出力した後に自分の研究内容を紹介するようにしてみましょう。
173+
146174## ` Date ` クラス
147175
148- [ ` Date ` クラス] ( https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Date ) は、JavaScriptに標準で用意されている 、日付や時刻を扱うためのクラスです。このように、JavaScriptでは 、開発者が定義しなくても最初から使用可能なクラスが数多く用意されています。
176+ [ ` Date ` クラス] ( https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Date ) は、JavaScript に標準で用意されている 、日付や時刻を扱うためのクラスです。このように、JavaScript では 、開発者が定義しなくても最初から使用可能なクラスが数多く用意されています。
149177
150178``` javascript
151179const myBirthDay = new Date (" 2014-05-06" ); // Dateクラスをインスタンス化
@@ -181,6 +209,14 @@ document.write(false.toString()); // false
181209```
182210:::
183211
184- ## 課題
212+ ### 課題
213+
214+ ` document.getElementById ` 関数で ` div ` 要素を取得すると、[ ` HTMLDivElement ` クラス] ( https://developer.mozilla.org/ja/docs/Web/API/HTMLDivElement ) のインスタンスが返されます。このクラスは [ ` HTMLElement ` クラス] ( https://developer.mozilla.org/ja/docs/Web/API/HTMLElement ) を継承しており、さらに ` HTMLElement ` クラスは [ ` Element ` クラス] ( https://developer.mozilla.org/ja/docs/Web/API/Element ) を、` Element ` クラスは [ ` Node ` クラス] ( https://developer.mozilla.org/ja/docs/Web/API/Node ) を継承しています。
215+
216+ ![ HTMLDivElementの継承関係] ( ./html-inheritance.drawio.svg )
217+
218+ 実は、[ DOM] ( ./../../1-trial-session/11-dom/index.md ) の節で使用した ` textContent ` プロパティは、この ` Node ` クラスで定義されています。
219+
220+ ` HTMLDivElement ` クラスを自分でインスタンス化し、` textContent ` プロパティに適当な値を代入して、` document.body.appendChild ` 関数を用いて、作成した ` div ` 要素を ` body ` 要素の中に追加しましょう。
185221
186- ` 継承 ` のセクションで登場した ` Student ` クラスを継承して ` SeniorStudent ` クラス
222+ (発展) ` document.body ` は何のクラスのインスタンスなのでしょうか。 ` appendChild ` メソッドはどのクラスに定義されているのでしょうか。
0 commit comments