みなさん、こんにちは!
タカハシ(@ntakahashi0505)です。
「初心者でもわかるGoogle Apps Scriptのクラスを作ろう!」のシリーズをお送りしています。
前回の記事はこちらです。
GASのクラスにconstructorメソッドを定義してプロパティを追加する方法をお伝えしました。
プロパティが追加できたので、今度はメソッドですね。
ということで、今回はGoogle Apps Scriptでクラスに最も簡単なメソッドを追加する方法です。
では、行ってみましょう!
前回のおさらい
では、前回のおさらいからです。
function myFunction() { class Person { constructor(name) { this.name = name; } } const p = new Person('Bob'); console.log(p); const q = new Person('Tom'); console.log(q); }
クラスPersonに、nameプロパティを追加しました。
そして、constructorメソッドが呼び出されたときに受け取る引数を、nameプロパティに格納するようにしています。
constructorメソッド内で使用されているthisキーワードは、生成されたインスタンス自身を表すんでしたね。
今回は、メソッドを追加していきますよ!
クラスにメソッドを追加する
さて、クラスPersonにメソッドを追加していきます。
で、ちょっと以下の記事を見て思い出してほしいのですが、オブジェクトのプロパティには関数を格納することもできました。
そして、その場合は、プロパティとは言わずにメソッドというんでしたね。
なので、クラスから生成したインスタンスにも、メソッドを追加しておくことができます。
メソッド構文
そのためには、クラス内に以下のメソッド構文を定義します。
//処理
}
お気づきの方もいるかと思いますが、書式はconstructorメソッドと同じです。
メソッド名を「constructor」ではない、別の任意のものにすれば、クラス内にメソッドが定義できるというわけです。
クラスにメソッドを追加したスクリプト
以下のスクリプトのように、greetメソッドを追加しました。
function myFunction() { class Person { constructor(name) { this.name = name; } greet() { Browser.msgBox(this.name + "です、こんにちは!"); } } const p = new Person('Bob'); p.greet(); const q = new Person('Tom'); q.greet(); }
クラスPersonの中に、greetメソッドを定義しました。
ちなみに、メッセージとして表示する内容に、thisキーワードを使用していますね。
クラスのメソッド内でthisキーワードを用いたときも、インスタンス自身を表します。
では、実行してみましょう。
まず「Bob」のgreetメソッドが実行されますが、「OK」をクリックすれば、続いて「Tom」のgreetメソッドも実行されますよ。
参考: prototypeプロパティにメソッドを追加する
「プロトタイプ」というキーワードについて解説をしておきます。
インスタンス生成するごとにメソッドが追加…
つまり、図にするとこういう状態ですね。
なんか、ちょっともったいなくありません?
プロパティの値はインスタンスが異なったら別の値が入ると予想されますから、別に気になりませんが、メソッドの内容は同じなのに、インスタンスが生成されればされるだけコピーされちゃいます。
メモリがもったいない!
どこか一箇所にメソッドを定義しておいて、それをすべてのインスタンスで使いまわしちゃいたい!
そんな願いを叶えるのが、プロトタイプという仕組みです。
プロトタイプとは
GASのすべてのクラスは、prototypeプロパティという特別なプロパティを持ちます。
デフォルトでは空のオブジェクトとなっていますが、そこにメンバーを追加することができます。
少し古い書き方をするなら、以下のような書式です。
//処理
}
インスタンスについてメソッドが呼び出された際、インスタンス内にそのメソッドが見当たらないときには、prototypeプロパティの内部を参照して呼び出すことができるという仕組みです。
図にすると、以下のようになりますね。
実は、class構文のメソッドは実際にはこのprototypeプロパティに格納されるように作られています。
MDNなどで組み込みオブジェクトのドキュメントを見るときに「Array.prototype.メンバー」などと表現されているのは、こういう意味があるからです。
まとめ
以上、Google Apps Scriptでクラスに最も簡単なメソッドを追加する方法をお伝えしました。
メソッド構文によるメソッドの追加の方法をぜひマスターくださいね。
では、次回からスプレッドシートのデータをクラス化していきたいと思います。
どうぞお楽しみに!