2.3 第1章のプロトタイプベースを検証してみよう

1. 作業フォルダを作成する

はじめに、作成するファイルを保存するためのフォルダを新しく作成します。前の手順に従って、「ch02」フォルダを作成しましょう。「ch02」は、「2 章」のことを表しています。まずは、先ほど作成した作業プロジェクトの中の「public」フォルダを開き、以下の手順に従って作業を進めてください。

① 図 2.2.4 の手順で[ファイル]→[新規]→[フォルダー]をクリックする

② [public]フォルダを選択した状態で、フォルダー名に「ch02」に入力し、[完了]をクリックします。

これで、本サンプルで作成するファイルを保存するための「ch02」フォルダができました。
今後、各章ごとに、「ch03」「ch04」・・・という具合に、新しくフォルダを作成していきます。

2. HTML ファイルと js ファイルにプログラムを記述

フォルダの準備ができたので、サンプルプログラムを作成していきましょう。
今、作成した ch02 フォルダに、prototype.html と prototype.js を作成し、記述をしていきます。

ソースフォルダ:public/ch02

ファイル名:prototype.html

➢ prototype.html

<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="UTF-8">
    <title>JavaScriptの練習: prototype.jsを実行中</title>
</head>

<body>
    <h1>JavaScriptの練習</h1>
    <p>prototype.jsを実行しています。ブラウザのポップアップ(アラート)を確認してください。</p>
    <script src="prototype.js"></script>
</body>
</html>

また、JavaScript 入門では、HTML に直接 JavaScript を記述していましたが、今回の JavaScript 入門では同じ名前の「prototype.js」という名前で JavaScript ファイルを作成し、そこに JavaScript コードを記述するようにして下さい。

ファイル名:prototype.js

➢ prototype.js

// prototype.js

// 1. 元となる「animal」オブジェクトを生成します
const animal = {
    eat: function () {
        return "食事をします。";
    }
};

// 2. animalをプロトタイプ(見本)として「dog」オブジェクトを生成します
const dog = Object.create(animal);

// 3. dogオブジェクト独自の動作「bark」を定義します
dog.bark = function () {
    return "ワンワン!";
};

// 4. 結果を表示します
alert("動物の動作(継承): " + dog.eat()); // プロトタイプから引き継いだ機能
alert("犬の動作(独自): " + dog.bark()); // 自身で定義した機能

Eclipse で記述すると、下図のようになります。

3. ブラウザで表示する

作成したファイルをブラウザで表示してみましょう。
使用するブラウザは、システムに登録されたデフォルトブラウザ(本書では Google Chrome)を使用します。
Eclipse 上で prototype.html を選択し、右クリックします。

コンテキストメニューから「次で開く」→「Web ブラウザー」を選択し、クリックします。
するとブラウザが立ち上がり、プログラムが実行されます。

実行結果

解説

このプログラムは動作確認が主目的で、記述内容の仕組みについては、第 5~6 章で詳しく学習します。
現時点ではソースコードの細かな理解は不要ですが、Java との対比も含めて簡単に見てみましょう。

このプログラムでは、JavaScript 特有の書き方で「オブジェクトの継承」を行っています。
4 行目で食事をする機能(eat)を持った「animal(動物)」というオブジェクトを作成します。

4: const animal = {
5:     eat: function() {
6:         return "食事をします。";
7:     }
8: };

11 行目で、この「animal(動物)」オブジェクトをプロトタイプにして、「dog」オブジェクトを生成します。
Object.create(animal)命令を使うことで、animal の機能をすべて引き継いだ新しいオブジェクト「dog(犬)」を作成できます。これが「プロトタイプベースの継承」です 。

11: const dog = Object.create(animal);

14 行目で、この「dog」オブジェクトに独自の動作「bark」を定義します。

14: dog.bark = function() {
15:     return "ワンワン!";
16: };

19 行目と 20 行目で、結果を alert で表示しています。
dog.eat()を実行すると、自分自身には定義されていないはずの「食事をします。」というメッセージが表示されます。これは、親である animal から機能を借りてきているためです。

19: alert("動物の動作(継承): " + dog.eat()); // プロトタイプから引き継いだ機能
20: alert("犬の動作(独自): " + dog.bark()); // 自身で定義した機能

Java で学んだ継承によく似ていますが、プロトタイプからオブジェクトを生成して継承しただけで、Java ほど明確な型宣言を行っている訳ではありません。これがプロトタイプベースの継承と呼ばれるものです。