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

}

참고