みなさん、こんにちは!
タカハシ(@ntakahashi0505)です。
「初心者でもわかるGoogle Apps Scriptでクラスを作ろう!」をテーマとしたシリーズをお送りしています。
前回の記事はこちら。
GASのクラスでプライベートプロパティを取得するメソッドを作る方法をお伝えしました。
さて、プライベートプロパティの値を取得する方法、実は別の方法があります。
それは、Object.definePropertiesメソッドを使う方法です。
ということで、今回はGoogle Apps ScriptでdefinePropertiesメソッドを使ってプロパティを定義する方法です。
では、行ってみましょう!
前回のおさらい
題材としているのは以下のスプレッドシートの表です。
この表の各行を表すクラスPersonを作成しました。
こちらのコードです。
function myFunction() { var Person = function(record){ var _id = record[0]; this.name = record[1]; this.gender = record[2]; this.birthday = record[3]; this.getId = function(){ return _id; }; }; var values = SpreadsheetApp.getActiveSheet().getDataRange().getValues(); var p = new Person(values[1]); Logger.log(p); Logger.log(p.getId()); }
ご覧の通り、idについては上書きをできないようにプライベートプロパティと、その読み取り用のメソッドで実現をしました。
ですが、もう少し凝った方法がありまして、それがdefinePropertiesメソッドを使って、オブジェクトにプロパティを直接定義してしまうという方法です。
definePropertiesメソッドでプロパティを定義する
definePropertiesメソッドは、オブジェクトに新しいプロパティを定義するメソッドです。
書式は以下の通りで、指定するオブジェクトにプロパティ名1、プロパティ名2、…と複数のプロパティを定義することができます。
{ プロパティ名1: 構成情報1 },
{ プロパティ名2: 構成情報2 },
…
)
構成情報1、構成情報2、…というのは、以下の形式で個々のプロパティに指定するものになります。
//get処理
},
set: function(value) {
//set処理
}
「get」には、そのプロパティを取得しようとした際の処理を記述します。一般的には、プライベート変数の値をreturnする処理が含まれます。
「set」には、そのプロパティに設定しようとした際の処理を記述します。一般的には、プライベート変数の値にvalueを代入する処理が含まれます。
setとgetはそれぞれ省略することができ、その場合にはそれぞれ読み取り専用、または書き込み専用のプロパティとなります。
definePropertiesメソッドによるクラスの読み取り専用のプロパティ
では、definePropertiesメソッドを使って、クラスが持つ「id」の値について、読み取り専用にするスクリプトを見ていきましょう。
こちらです。
function myFunction() { var Person = function(record){ var _id = record[0]; this.name = record[1]; this.gender = record[2]; this.birthday = record[3]; Object.defineProperties(this, { id: { get: function(){ return _id; } } }); }; var values = SpreadsheetApp.getActiveSheet().getDataRange().getValues(); var p = new Person(values[1]); Logger.log(p.id); p.id = 'a00'; Logger.log(p.id); }
9行目~16行目が、プロパティの定義になります。
definePropertiesにより、プロパティidを定義していて、「get」のみ設定をしていますから、読み取り専用になるのです。
実行結果がこちらです。
20,22行目でidプロパティの読み取りを行っていますが、これは普通に出力されています。
一方で、21行目でプロパティidに書き込みをトライしていますが、その上書きはされておらず、初期状態の値がログ出力されていることがわかりますね。
まとめ
以上、GASでdefinePropertiesメソッドを使ってクラスにプロパティを定義する方法をお伝えしました。
前回紹介した、コンストラクタ内にメソッドを定義するよりも、わかりやすくなり、可読性も上がったのではないかと思います。
どうぞ活用くださいね。
次回は、コンストラクタをメイン処理の外に出して即時関数化していきます。
どうぞお楽しみに!