アクセサとは
オブジェクトの中のプロパティの値を取り出したり、変更したりする関数のこと。
const obj = {
_name: "John"
}
const result = obj._name
console.log(result) // "John"
上記のコードを見ると、obj
の中にある_name
プロパティを参照してコンソール出力をするコードである。
持っている値を出力するだけのことですが、持っている値が変更される恐れもある。
const obj = {
_name: "John"
}
obj._name = "Sam"
const result = obj._name
console.log(result) // "Sam"
上記のようにobj._name
に直接アクセスしてSam
を代入して値を上書きしているため、result
も変わってしまうことがわかる。
この問題を解決するため必要なのがアクセサである。
アクセサを利用し得て、プロパティの値をアクセサを持って参照・変更できるようにすれば、obj._name
の値を保証することができる。
アクセサの種類(getterとsetter)
アクセサにはgetterとsetterの2種類ある。
getter
値を取得するプロパティ
const obj = {
_name: "John",
get name() {
return this._name
}
}
const result = obj.name
console.log(result) // "John"
ここのコードを見ると_name
に直接アクセスして値を取得せず、name
というgetter
を利用して取得している。
setter
値を変更するプロパティ
const obj = {
_name: "John",
get name() {
return this._name
},
set name(value) {
this._name = value
}
}
obj.name = "Sam"
const result = obj.name
console.log(result) // "Sam"
上記のコードでは_name
の値を変更する際、同名のname
のsetter
を持って変更している。
なお、setter
のname
はプロパティであるため、新しい値をセットする際には、以下のように書く。
obj.name = "Sam"
// ✖︎obj.name("Sam")
まとめると、ある特定のプロパティに直接アクセスして値を取り出したり変更せず、アクセサを持って行うことがgetterとsetterの役割である。
getterとsetterを使う利点
- あるスコープ内の値に外部からアクセスを制御するため、値の状態を管理することができる。
- 値にアクセスする前に検証を行うことができる。