【GAS】クラスとインスタンス化
Google Apps Script(GAS)ではクラス・インスタンスという概念があります。
ベーシックな処理で使うシーンは多くないですが、知っていると記述の幅が広がるのでぜひ覚えていってください。
なぜクラスとインスタンスが必要か
まずは下記のサンプルコードをご覧ください。
このオブジェクトpetには、animal、name、ageというプロパティとgreetというメソッドが用意されています。
function myFunction() {
const pet = {
animal: 'dog',
name: 'Ted',
age: 4,
born: 1996,
greet(){
console.log("Hi, I'm Ted.");
}
}
animal.greet();
}
Hi, I’m Ted.
このオブジェクトと同じ構造で、あと5匹分の動物のオブジェクトを用意する必要が出てきた場合どうすればよいでしょうか?
すべてのオブジェクトのプロパティとメソッドをもれなく記述しようとすると、サンプルコードの5倍のスクリプト量になってしまいますよね。冗長化しておりメンテナンスも難しそうなのが直感的にわかります。
この問題を解決するために、javascriptにはオブジェクトのひな形をベースとして同じメソッドやプロパティを持つ別のオブジェクトを生成する仕組みがあります。
クラス/インスタンスの定義
用語の定義としては下記です。
オブジェクト特性を定義するひな形
クラスをもとにしてオブジェクトを生成すること
インスタンス化によって生成されたオブジェクト
クラス/インスタンスのメリット
各オブジェクトをクラスから都度生成することにより、オブジェクトを毎回一から定義する必要がなくなり、簡潔なスクリプトにまとめることができます。
また、オブジェクトの構造を変えたいときも元のクラスの形式を変更してしまえば、連なるインスタンス構造も一括で変わるので修正やメンテナンスも簡単になります。
このようにしてクラスとインスタンスは、スクリプトの可読性、メンテナンス性、安全性等のさまざまな面でメリットがあります。
インスタンス化の手順
クラスの定義
class クラス名{クラス定義}
class文を使ってクラスを定義します。クラス名はの最初の文字は大文字で記述してください。
new演算子によるインスタンス化
new クラス名(引数1,引数2,引数3…)
定義したクラスをインスタンス化するにはnew演算子を使います。指定してクラス定義に基づいて生成されたインスタンスが戻り値として変えることになります。
もちろん、new演算子より前にclass文が処理される必要があるので記述には注意しましょう。
コンストラクタとthisキーワード
通常では、オブジェクトにプロパティを定義するには、ドット表記等でプロパティに代入を行います。例えば、「pet」というオブジェクトの「age」というプロパティに「6」という値を代入するには〈pet.age=6〉と記述ができます。
今回のように、petというオブジェクトひな形になるclassに対して、インスタンス化を実行するに際には、コンストラクタという特別な関数とthisキーワードを使います。
constructor(引数1, 引数2,…){
this.プロパティ1 = 引数1
this.プロパティ2 = 引数2
}
サンプルコード
function myFunction() {
class Pet{
constructor(animal, name, age){
this.animal = animal;
this.name = name;
this.age = age;
}
}
const p1 = new Pet('dog', 'ted', 4);
const p2 = new Pet('cat', 'jenny', 3);
console.log(p1);
console.log(p2);
}
{ animal: 'dog’, name: 'ted’, age: 4 }
{ animal: 'cat’, name: 'jenny’, age: 3 }
引数として与えた値をプロパティとして持つインスタンスの生成ができました。
メンバーの変更・追加
各インスタンスは個別に生成されたオブジェクトなので、メンバーの値の変更や新しいメンバーの追加も可能です。
function myFunction() {
class Pet{
constructor(animal, name, age){
this.animal = animal;
this.name = name;
this.age = age;
}
}
const p1 = new Pet('dog', 'ted', 4);
console.log(p1);
p1.age = 5; // メンバーの変更
p1.born = 1994;// メンバーの追加
console.log(p1);
}
{ animal: 'dog’, name: 'ted’, age: 4 }
{ animal: 'dog’, name: 'ted’, age: 5, born: 1994 }
このようにメンバーに変更を加えることはできますが、インスタンス生成後に変更を加えてしまうと可読性が落ちたりエラーの原因になりますの注意してください。
まとめ
GASにおけるクラス・インスタンスの定義、記述方法について解説しました。
- 「クラス」とはオブジェクト特性を定義するひな形
- 「インスタンス」とはクラスの型をもとに生成されたオブジェクトのこと
- クラスを使ってインスタンスを生成することで、可読性や安全性が高まるメリットがある
- インスタンス生成時のプロパティ定義方法は、コンストラクタメソッド、thisキーワードで指定
- new演算子を用いてインスタンスを生成できる