Skip to content

Commit 4fbcfbc

Browse files
authored
Merge pull request #10 from ut-code/add-questions
練習問題を大幅に追加
2 parents 3d0a89d + 1702e0a commit 4fbcfbc

File tree

6 files changed

+205
-11
lines changed

6 files changed

+205
-11
lines changed
380 KB
Loading
Lines changed: 135 additions & 0 deletions
Loading

docs/2-javascript-training/04-class/index.md

Lines changed: 43 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -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
1425
class Student {
@@ -27,9 +38,11 @@ class Student {
2738
const tanaka = new Student(); // Student クラスをもとにオブジェクトを作成する
2839

2940
tanaka.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
6887
const tanaka = new Student();
6988
tanaka.name = "田中";
7089
tanaka.age = 18;
7190

91+
// introduceSelf メソッド内では this は tanaka に格納されたオブジェクトになる
7292
tanaka.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", "ドイツ語");
143167
tanaka.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
151179
const 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` メソッドはどのクラスに定義されているのでしょうか。

docs/2-javascript-training/05-array/index.md

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -82,7 +82,7 @@ studentNames.push("内藤");
8282
document.write(studentNames[3]); // 内藤
8383
```
8484

85-
### `Array.length` プロパティ
85+
### `Array#length` プロパティ
8686

8787
[`Array#length` プロパティ](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/length)は、配列の長さを自動的に反映するプロパティです。
8888

@@ -93,6 +93,16 @@ studentNames.push("内藤");
9393
document.write(studentNames.length); // 4
9494
```
9595

96+
### 課題
97+
98+
- `Array#push` メソッドを用いて、フィボナッチ数列の配列を作ってみましょう。
99+
- 作成した配列の各要素を `for ~ of` 文を用いて出力してみましょう。
100+
- 作成した配列の各要素を、通常の `for` 文と `Array#length` プロパティを用いて出力してみましょう。
101+
102+
:::info ヒント
103+
変数 `i` を 0 から `(作成した配列の length プロパティの値) - 1` まで順番に増やしながら、配列の `i` 番目の要素を表示しましょう。
104+
:::
105+
96106
## 配列とオブジェクト
97107

98108
配列はオブジェクトの一種です。しかしながら、JavaScriptのオブジェクトとは、[オブジェクトの節](../../1-trial-session/10-object/index.md)で扱ったように、プロパティ名とプロパティ値の組み合わせでした。

0 commit comments

Comments
 (0)