見出し画像

【GAS】中級の復習 その2(クラス)

今日は2時間ほど前にワクチン1回目を接種してきた。腕が痛くなるという噂なのでドキドキ。というか既に鈍痛がある。まぁ明日も休みだし大丈夫でしょう。4連休バンザイ。

▼こちらの続きです。

GAS中級の山場とも言えるクラスの復習をした(毎回の山場感)。がっつり復習したけど理解度・腹落ち度は60%といったところ。

関数でいけるしなー・・・というのが今の率直な感想で、どういう場面で使うのかまだイメージが湧いていない。クラスはグローバル領域に書くことが多いということで、日付の操作などはクラス化すると便利かな・・というぐらい。

クラスの定義・インスタンス化

そもそもクラスとは何かというと「オブジェクトを作る機能」。クラスを定義するときは以下のように書く。

class クラス名 {
 //クラス定義
}

クラス名はパスカル記法(先頭が大文字・単語の区切りも大文字)で書くことが一般的。SheetNameみたいな。GetWildみたいな。

インスタンスというのはクラスから生成されるオブジェクトのこと。混乱するので私はオブジェクトと呼びたい。インスタンス化する(オブジェクトを作る)際は、以下のように書く。

new クラス名(引数1, 引数2,...)

書籍とかだと上記のように記法だけで書かれているけど、実際は変数に格納することがほとんどなので、以下のようなコードになる。

const p = new Person;

プロパティ定義

クラスはオブジェクトを生成するので、プロパティやメソッドを定義することができる。初級の復習をしたので、プロパティ・メソッドについての理解はOK。プロパティを定義する際はコンストラクタ関数を使う。

class クラス名 {
 constructor(仮引数1, 仮引数2,...) {
  //生成時の処理
 }
}
function myFunction2_04() {
 class Person {
   constructor(name, age) {
     this.name = name;
     this.age = age;
   }
 }

 const p1 = new Person(`Bob`, 25);
 console.log(p1, p1.name); //{ name: 'Bob', age: 25 } 'Bob'

 const p2 = new Person(`Tom`, 32);
 console.log(p2, p2.age); //{ name: 'Tom', age: 32 } 32
}

Personというクラスにname・ageというプロパティを定義。p1・p2という変数にPersonで定義した新たなオブジェクト(インスタンス)を生成し、Bob・25、Tom・32という引数を渡している、というコードになる。

3行目のconstructorの後の()内にあるname・ageは仮引数。

4・5行目のthis.name・this.ageはドット記法でプロパティを表していて、それらのプロパティに仮引数で受け取ったname・ageを格納している。

thisは生成されるインスタンスのことを表す。

仮引数とプロパティ名が一緒だと混乱する場合は、異なる言葉で書いてもいい気がする。

  class Person {
   constructor(n, a) {
     this.name = n;
     this.age = a;
   }

これは講座の先生からは「誰が見てもわかる変数で書いてくださいね」とたぶん若干怒られるやつなのでよろしくないけれど、要はこういうことです(?)。

メソッドの定義

メソッドを定義する場合は、constructorではなくメソッド定義で書く。

「メソッドを定義する場合は、メソッド定義で書く」ってなんのこっちゃ・・。メソッド定義とは、function〜とかの従来の関数リテラルではなく、オブジェクト内のメソッドの定義を簡略化して記述できる構文のこと(by GAS本)。

・class クラス名 {
 メソッド名(仮引数1, 仮引数2,...) {
  //メソッドの処理
 }
}
function myFunction2_12() {
 class Onigiri {
   constructor(name, price, stock) {
     this.name = name;
     this.price = price;
     this.stock = stock;
   }

   getTaxIncluded(tax = 0.1) {
     return this.price * (1 + tax);
   }

   isSoldOut() {
     return this.stock < 1;
   }
 }

 const onigiri = new Onigiri(`梅`, 120, 5);

 console.log(onigiri.getTaxIncluded(0.2)); //144
 console.log(onigiri.isSoldOut()); //false

}

メソッドなので、引数を受け取ることもできる。

インスタンス化する際に渡す引数(ここでは梅・120・5)と、メソッドに渡す引数(ここでは0.2)があるので、この辺はちょっと混乱ポイント。

オリジナルのクラス作ってみた

class GetCal {
 constructor(date) {
   this.date = new Date(date);
 }
 getYear() {
   return this.date.getFullYear();
 }
 getMonth() {
   return this.date.getMonth() + 1;
 }
 getDate() {
   return this.date.getDate();
 }
 getDay() {
   return this.date.getDay();
 }
}

function getCal() {
 const d = `2021/8/1`;
 const date = new GetCal(d);

 console.log(date.getYear(date)); //2021
 console.log(date.getMonth(date)); //8
 console.log(date.getDate(date)); //1
 console.log(date.getDay(date)); //0
}

日付を渡すと年・月・日・曜日を返してくれるクラス。一応できた・・w

うーーーーん、いまいち使うイメージが湧かないけど、日付関連でよく出てくるコード(例えば今週の最終営業日を返すとか)はクラスにしておくと便利なのかな。これから使っていけるようになりたい。

続く。腕痛い。

この記事が気に入ったらサポートをしてみませんか?