객체의 프로퍼티는 두 종류로 나뉜다.
첫 번째로는 데이터 프로퍼티로, 지금까지 사용한 모든 프로퍼티는 데이터 프로퍼티라 정한다.
두 번째는 접근자 프로퍼티다. 접근자 프로퍼티의 본질은 함수인데, 이 함수는 값을 획득(get)하고 설정(set)하는 역할을 담당한다. 그런데 외부 코드에서는 함수가 아닌 프로퍼티로 보인다.
접근자 프로퍼티는 getter(획득자)와 setter(설정자) 메서드로 표현된다. 객체 리터럴 안에서 getter 와 setter 메서드는 get과 set으로 나타낼 수 있다.
let obj = {
get propName() {
// getter, obj.propName을 실행할 때 실행되는 코드
},
set propName(value) {
// setter, obj.propName = value 를 실행할 때 실행되는 코드
}
};
getter 메서드는 obj.propName을 사용해 프로퍼티를 읽으려고 할 때 실행되고, setter 메서드는 obj.propName = value 으로 프로퍼티에 값을 할당하려 할 때 실행된다.
let user = {
name: "John",
surname: "Smith",
get fullName() {
return `${this.name} ${this.surname}`;
}
set fullName(value) {
[this.name, this.surname] = value.split(" ");
}
};
alert(user.fullName); // John Smith
user.fullName = "Alice Cooper";
alert(user.name); // Alice
alert(user.surname); // Cooper
위 코드와 같이, 외부에서는 접근자 프로퍼티를 일반 프로퍼티처럼 사용할 수 있다. 접근자 프로퍼티 자체가 이런 아이디어에서부터 출발했다. 접근자 프로퍼티를 사용하면 함수처럼 호출하지 않고, 일반 프로퍼티에서 값에 접근하는 것처럼 평범하게 user.fullName
을 사용해 프로퍼티 값을 얻을 수 있다. 나머지 작업은 getter 메서드가 뒷단에서 처리해 준다.
getter와 setter 메서드를 구현하면 객체에는 fullName이라는 ‘가상’의 프로퍼티가 생긴다. 가상의 프로퍼티는 읽고 쓸 수는 있지만 실제로는 존재하지 않는다.
문법상으로는 get, set 을 이용하여 getter 함수와 setter 함수를 만드는 게 맞지만
대부분은 아래와 같이 get… / set… 형식의 함수가 선호된다.