
photo credit: over 14 MILLION views Thanks SIA-7B prototype Italian plane 1917 NARA111-SC-14309-ac via photopin (license)
みなさん、こんにちは!
タカハシ(@ntakahashi0505)です。
「初心者でもわかるGoogle Apps Scriptのクラスを作ろう!」のシリーズをお送りしています。
前回の記事はこちらです。

GASのクラスにプロパティを追加する方法をお伝えしました。
プロパティが追加できたので、今度はメソッドですね。
ということで、今回はGoogle Apps Scriptでクラスに最も簡単なメソッドを追加する方法です。
では、行ってみましょう!
前回のおさらい
では、前回のおさらいからです。
function myFunction() { var Person = function(name){ this.name = name; }; var p = new Person("Bob"); Logger.log(p); var q = new Person("Tom"); Logger.log(q); }
クラスPersonに、nameプロパティを追加しました。そして、コンストラクタが呼び出されたときに受け取る引数を、nameプロパティに格納するようにしています。
コンストラクタ内で使用されているthisキーワードは、生成されたインスタンス自身を表すんでしたね。
今回は、メソッドを追加していきますよ!
クラスにメソッドを追加する
さて、クラスPersonにメソッドを追加していきます。
で、ちょっと以下の記事を見て思い出してほしいのですが、オブジェクトのプロパティには関数を格納することもできました。
そして、その場合は、プロパティとは言わずにメソッドというんでしたね。

ということは、メソッドを追加するには、コンストラクタ内にインスタンスのプロパティへ関数を代入する処理を追加すればいいんです。
クラスにメソッドを追加したスクリプト
以下のスクリプトのように、greetメソッドを追加しました。
function myFunction() { var Person = function(name){ this.name = name; this.greet = function(){ Browser.msgBox(this.name + "です、こんにちは!"); }; }; var p = new Person("Bob"); Logger.log(p); p.greet(); var q = new Person("Tom"); Logger.log(q); q.greet(); }
コンストラクタPersonの中に、greetプロパティに、メッセージダイアログを表示する関数を格納します。
その場合、greetメソッドになるわけですね。
そして、メッセージとして表示する内容に、インスタンス自身thisのnameプロパティを使っています。
では、実行してみましょう。
この図は「Bob」のgreetメソッドですが、「OK」をクリックすれば、続いて「Tom」のgreetメソッドも実行されますよ。
そして出力されたログがこちらです。
インスタンスpとインスタンスqそれぞれにメソッドが追加されていることが確認できますね。
prototypeプロパティにメソッドを追加する
それぞれにメソッドが追加…
つまり、図にするとこういう状態ですね。
なんか、ちょっともったいなくありません?
プロパティの値はインスタンスが異なったら別の値が入ると予想されますから、別に気になりませんが、メソッドの内容は同じなのに、インスタンスが生成されればされるだけコピーされちゃいます。
メモリがもったいない!
どこか一箇所にメソッドを定義しておいて、それをすべてのインスタンスで使いまわしちゃいたい!
そんな願いを叶えるのが、プロトタイプという仕組みです。
プロトタイプとは
GASのすべてのクラスは、prototypeプロパティという特別なプロパティを持ちます。
デフォルトでは空のオブジェクトとなっていますが、そこにメンバーを追加することができます。
メソッドを追加するなら、以下のような書式になります。
//処理
}
インスタンスについてメソッドが呼び出された際、インスタンス内にそのメソッドが見当たらないときには、prototypeプロパティの内部を参照して呼び出すことができるという仕組みです。
図にすると、以下のようになりますね。
GASでは、コンストラクタで個別のインスタンスにメソッドを追加することをせずに、prototypeプロパティに追加するのが一般的ですね。
プロトタイプにメソッドを追加したスクリプト
では、先ほどのスクリプトについて、クラスPersonのprototypeプロパティにメソッドを追加するように修正してみましょう。
function myFunction() { var Person = function(name){ this.name = name; }; Person.prototype.greet = function(){ Browser.msgBox(this.name + "です、こんにちは!"); }; var p = new Person("Bob"); Logger.log(p); p.greet(); var q = new Person("Tom"); Logger.log(q); q.greet(); }
実行すると、先ほどと同様にメソッドが呼び出せていることを確認できるはずです。
まとめ
以上、Google Apps Scriptでクラスに最も簡単なメソッドを追加する方法をお伝えしました。
プロトタイプという仕組みとprototypeプロパティを使ったメソッドの追加の方法をぜひマスターくださいね。
では、次回からスプレッドシートのデータをクラス化していきたいと思います。
どうぞお楽しみに!