Object Enhancements
get 구문은 객체의 프로퍼티를 그 프로퍼티를 가져올 때 호출되는 함수로 바인딩 합니다.
반면 set 구문은 어떤 객체의 속성에 이 속성을 설정하려고 할 때 호출되는 함수를 바인드 합니다.
심볼(symbol)은 고유하고 수정 불가능한 데이터 타입이며 주로 객체 속성(object properties)들의
식별자로 사용됩니다. 심볼 객체(symbol object)는 심볼 기본형 변수(primitive data type)의
암묵적(implicit) 객체 래퍼(wrapper)입니다.
영상 강의
PART 1
PART 2
codepen
예제
객체 사용 방법이 보다 향상되어 사용하기 유용해 졌습니다.
기존 코드는 아래처럼 정해진 속성 이름으로 객체의 메서드를 설정해야 합니다.
var name = 'SM7',
maker = 'Samsung',
boost = function() {};
// car 객체 정의
var car = {
go: function() {},
stop: function() {},
boost: boost
};
ES6+ 부터는 아래와 같이 향상된 객체 표기법을 사용해 코드를 작성할 수 있습니다.
- 간추린 메서드(Abbreviated method) 표기법
- 계산된 속성 이름 동적(Computed Dynamic Property Name) 설정
간추린 메서드 표기법
let name = 'SM7',
maker = 'Samsung',
boost = 'powerUp';
const car = {
// 간추린 메서드 표기법
go() {},
stop() {},
boost() {}
};
console.dir(car);
// Object
// ↳ go: ƒ go()
// ↳ stop: ƒ stop()
// ↳ boost: ƒ boost()
// ↳ __proto__: Object
계산된 속성 이름 동적 설정
변수 또는 JavaScript 식에 의해 계산된 속성 이름을 동적으로 설정할 수도 있습니다.
let name = 'SM7',
maker = 'Samsung',
boost = 'powerUp',
dynamicMethod = 'Satisfactory';
const car = {
go() {},
['stop']() {},
[boost]() {}, // 변수를 받아 계산된 속성 이름 적용 가능
[`${dynamicMethod.replace(/s/ig, 'S')}`]() {} // JavaScript 식을 계산하여 동적으로 속성 이름 적용 가능
};
console.dir(car);
// Object
// ↳ go: ƒ go()
// ↳ powerUp: ƒ [boost]()
// ↳ stop: ƒ ['stop']()
// ↳ SatiSfactory: ƒ [`${dynamicMethod.replace(/s/ig, 'S')}`]()
// ↳ __proto__: Object
getter/setter 활용
ES6+ 부터 get, set 구문을 사용할 수 있습니다.
JavaScript는 비공개(private) 접근 제어자를 제공하지 않습니다.
대체적으로 비공개 속성임을 암시하기 위해 언더스코어(_)를 속성 이름 앞에 붙여 사용하는 관례가 있습니다.
하지만 비공개 속성이 아니므로 접근이 불가능한 것은 아닙니다.
const car = {
// 감춰진(private) 속성
// JavaScript 언어에서는 private를 지원하지 않아
// 이름 작성 시, _ 기호를 붙여 암시.
_wheel: 4,
// 게터(getter)
get wheel() {
return this._wheel;
},
// 세터(setter)
set wheel(new_wheel) {
this._wheel = new_wheel;
}
};
console.log(car.wheel); // 4
car.wheel = 8;
console.log(car.wheel); // 8
// 비공개 속성임을 암시하는 언더스코어가 있지만,
// 접근이 불가능한 것은 아닙니다.
console.log(car._wheel); // 8
Symbol 활용
비공개 접근 제어자를 지원하지는 않지만, 외부와 단절된 블록 영역과 Symbol을 사용한 고유 식별자를 활용해 접근 불가능한 속성을 사용할 수 있습니다.
{
// 심볼(Symbol) 등록
// - 고유하고 수정 불가능한 데이터 타입이며
// 주로 객체 속성(object property)들의 식별자로 사용된다.
let _wheel = Symbol('wheel');
global.car = {
// 등록된 심볼을 계산된 속성으로 사용
[_wheel]: 4,
get wheel() {
return this[_wheel]; // 심볼 반환
},
set wheel(new_wheel) {
if ( typeof new_wheel !== 'number' ) {
throw new Error('전달 인자 유형은 숫자여야 합니다.');
}
// 계산된 값을 심볼에 할당
this[_wheel] = new_wheel > 4 ? new_wheel : 4;
}
};
}