JavaScript アドバンス

JS オブジェクトアクセサ

1. JavaScriptのGetterとSetter

Getter(ゲッター)とSetter(セッター)を使用することで、オブジェクトアクセサ(Object Accessors / 計算済みプロパティ)を定義することができます。

2. JavaScript Getter(getキーワード)

以下の例では、lang プロパティを使用して language プロパティの値を取得(get)しています。

// オブジェクトの作成:
const person = {
  firstName: "John",
  lastName: "Doe",
  language: "en",
  get lang() {
    return this.language;
  }
};

// Getterを使用してオブジェクトからデータを表示する:
document.getElementById("demo").innerHTML = person.lang;

3. JavaScript Setter(setキーワード)

以下の例では、lang プロパティを使用して language プロパティの値を**設定(set)**しています。

const person = {
  firstName: "John",
  lastName: "Doe",
  language: "",
  set lang(lang) {
    this.language = lang;
  }
};

// Setterを使用してオブジェクトのプロパティを設定する:
person.lang = "en";

// オブジェクトのデータを表示する:
document.getElementById("demo").innerHTML = person.language;

4. 関数か、それともGetterか?

次の2つの例の違いは何でしょうか?

const person = {
  firstName: "John",
  lastName: "Doe",
  fullName: function() {
    return this.firstName + " " + this.lastName;
  }
};

// メソッドとしてオブジェクトからデータを表示する:
document.getElementById("demo").innerHTML = person.fullName();
const person = {
  firstName: "John",
  lastName: "Doe",
  get fullName() {
    return this.firstName + " " + this.lastName;
  }
};

// Getterとしてオブジェクトからデータを表示する:
document.getElementById("demo").innerHTML = person.fullName;

5. データ品質の担保

JavaScriptにおいてGetterとSetterを使用すると、より高いデータ品質(Data Quality)を確保できます。

次の例では、lang プロパティを使用して、language プロパティの値を大文字にして返しています。

// オブジェクトの作成:
const person = {
  firstName: "John",
  lastName: "Doe",
  language: "en",
  get lang() {
    return this.language.toUpperCase();
  }
};

// Getterを使用してオブジェクトからデータを表示する:
document.getElementById("demo").innerHTML = person.lang;

また、次の例では、lang プロパティを使用して、language プロパティに大文字の値を保存しています。

const person = {
  firstName: "John",
  lastName: "Doe",
  language: "",
  set lang(lang) {
    this.language = lang.toUpperCase();
  }
};

// Setterを使用してオブジェクトのプロパティを設定する:
person.lang = "en";

// オブジェクトのデータを表示する:
document.getElementById("demo").innerHTML = person.language;

6. なぜGetterとSetterを使用するのか?

  • 構文(Syntax)がシンプルになる
  • プロパティとメソッドに対して等しい構文が使える
  • より良いデータ品質を確保できる
  • バックグラウンドで処理を行う際に有用である

単純な値を扱うだけであれば、GetterやSetterは避けましょう(使いすぎの防止)。

7. Object.defineProperty() メソッド

Object.defineProperty() メソッドを使用して、後からGetterやSetterを追加することも可能です。

7.1 カウンターの例

// オブジェクトの定義
const obj = {counter : 0};

// SetterとGetterを定義
Object.defineProperty(obj, "reset", {
  get : function () {this.counter = 0;}
});
Object.defineProperty(obj, "increment", {
  get : function () {this.counter++;}
});
Object.defineProperty(obj, "decrement", {
  get : function () {this.counter--;}
});
Object.defineProperty(obj, "add", {
  set : function (value) {this.counter += value;}
});
Object.defineProperty(obj, "subtract", {
  set : function (value) {this.counter -= value;}
});

// カウンターを操作する:
obj.reset;
obj.add = 5;
obj.subtract = 1;
obj.increment;
obj.decrement;