들어가며
- 이 내용은 Javascript ES6+ 제대로 알아보기 - 중급 강의 중 Symbol를 정리한 내용 입니다.
- 강의링크
Symbol
- ES6에서 새로 추가된 자료형
- 유일무이하고 고유한 존재
- 비공개 멤버에 대한 요구에서 탄생
- 기본적인 열거대상에서 제외
- 암묵적 형변환 불가
유일무의하고 고유한 존재
Symbol를 생성할 때 같은 string을 부여한다해도 둘을 다르다고 평가한다. 따라서 생성할 때 Symbol을 저장하고 있는 변수가 계속 필요하다.
1
2
3
4
const sy1 = Symbol('symbol');
const sy2 = Symbol('symbol');
sy1 === sy2; // false
Symbol를 이용한 비공개 멤버 구현
obj라는 함수는 객체를 반환하는 기능을 가지고 있는 함수 이다.
_name이라는 Symbol
를 생성해서 반환할 객체에 프로퍼티명으로 지정하였다.
obj 함수 밖에서는 _name
값을 알 수 없기 때문에(유일무의한 값이기 때문에) 제공해주는 getter, setter를 이용해서 name을 조작해야될 수 밖에 없다.
이러써 name 프로퍼티를 은닉화 할 수 있게 되었다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
const obj = () => {
const _name = Symbol();
return {
[_name]: '',
get name() {
return this[_name];
},
set name(name) {
if(name?.length > 0) {
this[_name] = name;
}
}
}
}
const x = obj();
x.name = 'Tom'
물론 Reflect.ownKeys()
를 이용해서 객체에 속한 Symbol도 뽑을 수 있지만 뽑아낸 Symbol이 어떠한 의미인지 모르기 때문에 실제 사용단계에서는 접근하기가 불가능 할 것이다.