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;
}
};
}