関数のようなアクセサ

オブジェクトのプロパティを参照・代入しただけで、そのときに関数(メソッド)のように処理を行えるのが、getsetキーワードを用いたアクセサ。コードの見た目が「オブジェクト.プロパティ」だけでも、油断できないJavaScript。

// 関数のようなアクセサ(ゲッターとセッター)

const 人 = {
  // セッター
  set 名前(name) {
    this.name = name
    console.log('名前を' + name + 'に設定')
    return 1 // 戻り値は無意味
  },
  // ゲッター
  get ちゃん() {
    console.log(this.name + 'ちゃん')
    // 戻り値はundefined
  },
  get 様() {
    return this.name + '様'
  },
}

// セッターが代入時に呼ばれる
人.名前 = 'アリス' // 名前をアリスに設定
// セッターの参照では処理は行われない
console.log(人.名前) // undefined

// ゲッターが参照時に呼ばれる
// ()を付けていないのに関数と同様の働き。関数ではないので()を付けるとエラー
人.ちゃん // アリスちゃん

// ゲッターには戻り値があり、typeofは戻り値を判定(これではアクセサか否かの判定はできない)
console.log(typeof 人.ちゃん, typeof 人.様)
// アリスちゃん
// undefined string