【JavaScript】アクセサープロパティ - セッター・ゲッター
JavaScriptのアクセサープロパティについて解説します。
検証環境
アクセサープロパティ
アクセサープロパティは“値の記憶や取得時に処理を伴うオブジェクトのプロパティ”です。
メソッドのように定義しますが、プロパティのように扱うことができます。
アクセサープロパティは値の設定処理(セッター)と値の取得処理(ゲッター)のいずれかまたは両方を定義して使います。
セッター
セッターは“アクセサープロパティの『値の設定処理』”です。
定義
基本構文
{
set アクセサープロパティ名( 仮引数 ) {
// 処理...
}
}
基本的にはオブジェクトメソッドの構文と同じですが、先頭にsetキーワードを付けます。
サンプル
let person = {
l_name: "",
f_name: "",
___ih_hl_start
set full_name( name ) {
const n = name.split(' ');
this.l_name = n[0];
this.f_name = n[1];
}
___ih_hl_end
}
5〜9行目がセッターの定義です。
full_name
というアクセサープロパティ名のセッターを定義しています。
値の設定
セッターを定義したアクセサープロパティは通常のプロパティのように値を代入できます。
基本構文
変数.アクセサープロパティ名 = 値
サンプル
let person = {
l_name: "",
f_name: "",
set full_name( name ) {
const n = name.split(' ');
this.l_name = n[0];
this.f_name = n[1];
}
}
___ih_hl_start
person.full_name = "TANAKA TARO";
___ih_hl_end
console.log(person.l_name);
console.log(person.f_name);
TANAKA
TARO
12行目がアクセサープロパティの値設定です。
通常のプロパティのように値を代入していますが、セッターの処理が実行されます。
セッターの引数には代入した値が与えられます。
このセッターの処理はl_name
プロパティとf_name
プロパティに文字を分割して代入しています。
※name.split(' ')
は変数name
の文字列をスペースで分割し配列にする処理です。
実行結果から各プロパティに値が記憶されていることが確認できます。
ゲッター
ゲッターは“アクセサープロパティの『値の取得処理』”です。
定義
基本構文
{
get アクセサープロパティ名() {
// 処理...
return 値;
}
}
サンプル
let person = {
l_name: "TANAKA",
f_name: "TARO",
___ih_hl_start
get full_name() {
const name = this.l_name + ' ' + this.f_name;
return name;
}
___ih_hl_end
}
5〜8行目がゲッターの定義です。
full_name
というアクセサープロパティのゲッターを定義しています。
値の取得
ゲッターを定義したアクセサープロパティは通常のプロパティのように値を取得できます。
基本構文
変数.アクセサープロパティ名
サンプル
let person = {
l_name: "TANAKA",
f_name: "TARO",
get full_name() {
const name = this.l_name + ' ' + this.f_name;
return name;
}
}
___ih_hl_start
console.log(person.full_name);
___ih_hl_end
TANAKA TARO
11行目がアクセサープロパティの値取得です。
通常のプロパティのように値を取得していますが、ゲッターの処理が実行されます。
このゲッターの処理はl_name
プロパティとf_name
プロパティを文字結合し戻り値として返します。
実行結果から結合した文字列を取得できたことが確認できます。
両方の定義
同じアクセサープロパティ名でセッターとゲッターを定義することができます。
let person = {
l_name: "",
f_name: "",
___ih_hl_start
set full_name( name ) {
const n = name.split(' ');
this.l_name = n[0];
this.f_name = n[1];
},
___ih_hl_end
___ih_hl_start
get full_name() {
const name = this.l_name + ' ' + this.f_name;
return name;
}
___ih_hl_end
}
person.full_name = "TANAKA TARO";
console.log(person.full_name);
TANAKA TARO
5〜9行目のセッターと11〜14行目のゲッターは同じアクセサープロパティ名です。
このようにすることで、値の設定時はセッターを実行し、値の取得時はゲッターを実行します。
クラスでの利用
アクセサープロパティはクラスの定義で使用できます。
クラスレベルのアクセサープロパティ
クラスレベルのアクセサープロパティを使用するにはセッター・ゲッターの定義の先頭にstaticキーワードを付けます。
class Person {
static l_name;
static f_name;
___ih_hl_start
static set full_name( name ) {
const n = name.split(' ');
this.l_name = n[0];
this.f_name = n[1];
}
___ih_hl_end
___ih_hl_start
static get full_name() {
return this.l_name + ' ' + this.f_name;
}
___ih_hl_end
}
Person.full_name = "TANAKA TARO";
console.log(Person.full_name);
TANAKA TARO
セッター(5〜9行目)とゲッター(11〜13行目)はstaticキーワードが付いているため、full_name
アクセサープロパティはクラスレベルになります。
16行目・17行目でクラス経由のアクセスをしており、実行結果から正常に動作したことが分かります。
オブジェクトレベルのアクセサープロパティ
オブジェクトレベルのアクセサープロパティを使用するには通常のアクセサープロパティと同様に定義可能です。
class Person {
l_name;
f_name;
___ih_hl_start
set full_name( name ) {
const n = name.split(' ');
this.l_name = n[0];
this.f_name = n[1];
}
___ih_hl_end
___ih_hl_start
get full_name() {
return this.l_name + ' ' + this.f_name;
}
___ih_hl_end
}
let person = new Person();
person.full_name = "TANAKA TARO";
console.log(person.full_name);
TANAKA TARO
full_name
アクセサープロパティはオブジェクトレベルのプロパティになります。
実行結果からPerson
クラスから生成したオブジェクトがfull_name
アクセサープロパティ(セッター・ゲッター)を持つことが確認できます。