GASでdefinePropertiesメソッドを使ってクラスにプロパティを定義する方法


みなさん、こんにちは!
タカハシ(@ntakahashi0505)です。

「初心者でもわかるGoogle Apps Scriptでクラスを作ろう!」をテーマとしたシリーズをお送りしています。

前回の記事はこちら。

Google Apps Scriptでプライベートプロパティを取得するメソッドを作成する方法
初心者でもわかるGoogle Apps Scriptでクラスを作るシリーズをお送りしています。今回は、GASでクラスのプライベートプロパティを取得するメソッドを作成する方法についてお伝えします。

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、…と複数のプロパティを定義することができます。

Object.defineProperties(オブジェクト,
 { プロパティ名1: 構成情報1 },
 { プロパティ名2: 構成情報2 },
 …
)

構成情報1、構成情報2、…というのは、以下の形式で個々のプロパティに指定するものになります。

get: function() {
 //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」のみ設定をしていますから、読み取り専用になるのです。

実行結果がこちらです。

GASでプロパティを読み取ったログ

20,22行目でidプロパティの読み取りを行っていますが、これは普通に出力されています。

一方で、21行目でプロパティidに書き込みをトライしていますが、その上書きはされておらず、初期状態の値がログ出力されていることがわかりますね。

まとめ

以上、GASでdefinePropertiesメソッドを使ってクラスにプロパティを定義する方法をお伝えしました。

前回紹介した、コンストラクタ内にメソッドを定義するよりも、わかりやすくなり、可読性も上がったのではないかと思います。

どうぞ活用くださいね。

次回は、コンストラクタをメイン処理の外に出して即時関数化していきます。

Google Apps Scriptで即時関数にクラスを定義する理由とその方法
「初心者向けGoogle Apps Scriptでクラスを作る!」シリーズをお伝えしています。今回は、GASで即時関数にクラスを定義する理由とその方法についてお伝えします。スコープとthisが重要な役割を果たします。

どうぞお楽しみに!

連載目次:初心者向けGoogle Apps Scriptでクラスを作ろう

使いどころやそのメリットが分かりづらいGASの「クラス」。本シリーズでは、初心者でもわかるように「これでもか!」とじっくり着実にクラスとそのメリットについて解説をしていきます。
  1. 【初心者向け】Google Apps Scriptでクラスを理解するためのオブジェクトの基礎知識
  2. 初心者でもできるGoogle Apps Scriptで最も簡単なクラスを作る方法
  3. Google Apps Scriptでクラスに最も簡単なプロパティを追加する方法
  4. Google Apps Scriptでクラスに最も簡単なメソッドを追加する方法
  5. Google Apps Scriptでスプレッドシートのデータの1行分を表すクラスを作る方法
  6. GASでゲッターを使って簡単なプロパティを作成する方法
  7. GASでセッターを使ってプロパティの入力に制限をかける

タイトルとURLをコピーしました