みなさん、こんにちは!
タカハシ(@ntakahashi0505)です。
「初心者でもわかるGoogle Apps Scriptでクラスを作ろう!」をシリーズでお送りしております。
前回の記事はこちらです。
スプレッドシートの表の一行分を表すクラスを作成しました。
ただ、このクラスをもとに生成したインスタンス、すべてのプロパティが外部から読み書き自由です。
特にid…そう簡単に上書きされたら困りますよね。
ということで、今回はプロパティを上書きできないようにしていきます。
では、Google Apps Scriptのクラスでプライベートプロパティを作成する方法です。
では、行ってみましょう!
前回のおさらい
まず、対象としているスプレッドシートはこんな感じのものです。
このスプレッドシートの各行のデータを表すクラスを作成しました。
こちらです。
function myFunction() { var Person = function(record){ this.id = record[0]; this.name = record[1]; this.gender = record[2]; this.birthday = record[3]; }; Person.prototype.greet = function(){ Browser.msgBox(this.name + "です、こんにちは!"); }; Person.prototype.log = function(){ Logger.log('%s|%s|%s|%s|', this.id, this.name, this.gender, this.birthday); }; var values = SpreadsheetApp.getActiveSheet().getDataRange().getValues(); var p = new Person(values[1]); p.log(); p.greet(); var q = new Person(values[2]); q.log() q.greet(); }
各列のデータをそれぞれid,name,gender,birthdayというプロパティで表して、かつ挨拶をするgreetメソッド、全部のデータをログ出力するlogメソッドを追加しました。
ただ、冒頭でもお話したとおり、idプロパティ…できれば上書きできないようにしたいですよね(実際、名前も性別も誕生日もですがw)。
ということで、今回はidを表すデータについて外部から上書きできないようにしていきます。
プライベートメンバーを定義する
idを表すデータについて外部から上書きできないようにする…要件を整理すると、以下のようなかたちです。
- インスタンス内にいわゆるプロパティ以外の方法でデータを保持をする
- そしてそのidのデータは外部からアクセスできない
これを実現する方法として、JavaScriptではプライベートメンバーという方法が用意されています。
プライベートメンバーの構文
なんか難しそうな名前ですが、コンストラクタ内でvarキーワードを使った変数や関数を普通に宣言するというものです。
プライベートプロパティであれば
プライベートメソッドであれば
//処理
}
とします。
プライベートプロパティを作るスクリプト
今回はプライベートプロパティをつくりたいので、以下のようにしてみました。
function myFunction() { var Person = function(record){ var _id = record[0]; this.name = record[1]; this.gender = record[2]; this.birthday = record[3]; }; var values = SpreadsheetApp.getActiveSheet().getDataRange().getValues(); var p = new Person(values[1]); Logger.log(p); Logger.log(p._id); }
ちなみに、変数名をアンダースコア(_)からはじめているのは、慣例的に使用されている「プライベートのしるし」です。
実行すると、以下のようなログが確認できます。
変数_idにはアクセスできませんね。
プライベートメンバーの仕組み
プライベートメンバーの仕組みですが、何も特別なことをしているわけではなく、スコープを利用しているだけです。
コンストラクタは関数ですから、その中の変数は外部からは参照することができません。
一方で、new演算子で呼び出されてインスタンス化されていますので、そのインスタンスが存在している間、その内部の変数は保持されているのです。
まとめ
Google Apps Scriptのクラスでプライベートプロパティを作成する方法をお伝えしました。
スコープの仕組みさえ頭に入っていれば、まあ普通のことですね。
ただ…このままでは上書きもできませんが、読み取りもできないですよね…
ということで、次回は読み取りをするためのメソッドを作っていきます。
どうぞお楽しみに!