getter = 객체의 속성(property)값을 반환하는 메서드 / property를 읽을 때 동작
setter = 객체의 속성 값을 설정, 변경하는 메서드 / property에 값을 쓸 때 호출
get 과 set 은 같이 사용
// user에 직접 접근가능
let person = {
name : "js"
}
user.name = "javascript"
-------------------------------
// get과 set을 사용
let person = {
name : "js",
getName() {
return person.name ;
},
setName(value) {
person.name = value;
}
}
person.setName("javascript")
안전성
객체에 직접 접근하여 수정 가능하지만 그럴 경우 속성에 직접 접근을 하여 원치않는 값이 임의로 입력되거나 수정 될 수 있음
get 과 set을 사용 할 경우 값에 접근하는 것을 우회시키기 때문에 (setName) 객체 내부의 변수는 내부에서만 사용
메서드 안에서 다양한 조건 체크 및 수정등이 가능하게 하여 유지보수성을 높일 수 있음
보안성
객체 내부 속성에 직접 접근하지 않아 객체의 정보를 숨겨 보안을 강화
function User(name, age) {
this.name = name;
this.age = age;
}
let Choonsik = new User("춘식이", 3);
alert( Choonsik.age ); // 3
----------------------------------------------------
// age 보다 birthday가 정확하여 수정이 필요해 진 상태
function User(name, birthday) {
this.name = name;
this.birthday = birthday;
}
let Choonsik = new User("춘식이", new Date(2020, 7, 20));
위 코드처럼 수정 할 경우 age가 사용 된 부분을 모주 수정해야한다. (시간이 오래 걸리고 어디에 age가 사용된 지 다 알 수 없.......)
또 age를 User에 남겨둬도 무방한 경우 혹은 다른 방식이나 협업하는 다른 사람이 사용 할 여지가 있어 남기고 싶은 경우도 있을 수 있다.
function User(name, birthday) {
this.name = name;
this.birthday = birthday;
// age는 현재 날짜와 생일을 기준으로 계산됩니다.
Object.defineProperty(this, "age", {
get() {
let todayYear = new Date().getFullYear();
return todayYear - this.birthday.getFullYear();
}
});
}
let Choonsik = new User("춘식이", new Date(2020, 7, 20));
alert( Choonsik.birthday ); // birthday를 사용
alert( Choonsik.age ); // age 역시 사용 가능
위 처럼 getter와 setter을 사용 할 경우 언제 어디서든 프로퍼티의 행동과값을 조정할 수 있다.
Object.defineProperty()는 객체의 속성을 정의하고 수정하는 메서드로 ES6가 나오기 전 ES5에서 많이 사용, 현재는 가독성이 떨어지고 디버깅이 어려울 수 있어 사용 빈도가 감소하는 추세라고 함!
getter와 setter 사용 중 Maximum call stack size 라는 문구와 함께 무한 루프에 빠질 수 있다. 이때는 _를 사용하자
`
참고_ko.javascript.info
참고_inpa.tistory