Arrow Function, 프로퍼티 플래그와 설명자

100pearlcent·2021년 9월 15일
0

JavaScript

목록 보기
12/22
post-thumbnail

Arrow Function

화살표 함수는 단지 함수를 짧게 쓰기위한 용도로 사용되지 않는다
JavaScript 사용 시에 멀리 떨어진 곳에서 실행될 작은 함수를 작성하고 그 함수를 어딘가에 전달하게 되면 컨텍스트를 잃을 수 있는 가능성이 높아진다
👉 화살표 함수를 사용하면 현재 컨텍스트를 잃지 않아 편리하다

  • this를 가지지 않는다
  • arguments를 지원하지 않는다
  • new와 함께 호출할 수 없다
  • super가 없다



- 'this'가 없다

화살표 함수 본문에서 this에 접근하면, 외부에서 값을 가져온다

let group = {
	title: 'GROUP1',
  	students: ['a', 'b', 'c'],
  
  showList() {
  	this.students.forEach(
      student => alert(this.title + ': ' + student)
      );
  }
};

group.showList();

forEach 문에서 화살표 함수를 사용했기 때문에 화살표 함수 본문의 this.title은 화살표 함수 바깥의 메서드인 showList가 가리키는 대상과 동일해진다
👉 this.title = group.title


- 'arguments'가 없다

일반 함수와는 다르게 모든 인수에 접근할 수 있게 해주는 유사 배열 객체 arguments를 지원하지 않는다
👉 현재 this값과 arguments정보를 함께 실어 호출을 포워딩해주는 데코레이터를 만들 때 사용 됨

function defer(f, ms) {
	return function() {
    	setTimeout(() => f.apply(this, arguments), ms)
    };
}

function sayHi(who) {
	alert('안녕, ' + who);
}

let sayHiDeferred = defer(sayHi, 2000);
sayHiDeferred('진주'); // 2초 후, '안녕, 진주' 출력



프로퍼티 플래그와 설명자

프로퍼티 플래그

객체 프로퍼티는 value와 함께 flag라고 불리는 속성 세 가지를 가진다

  • writable - true이면 값 수정 가능, false면 readonly
  • enumerable - true이면 프로퍼티 삭제나 수정 가능, false면 반복문 사용 불가
  • configurable - true이면 프로퍼티 삭제나 수정 가능, false면 불가능

프로퍼티 플래그는 특별한 경우가 아니고선 다룰 일이 없다
기본적으로 프로퍼티를 만들면 해당 프로퍼티의 플래그는 모두 true로 설정된다

- 플래그 얻기

Object.getOwnPropertyDescriptor 메서드를 사용하면 특정 프로퍼티에 대한 정보를 모두 얻을 수 있다

let descriptor = Object.getOwnPropertyDesciptor(obj, propertyName);

obj: 정보를 얻고자 하는 객체
propertyName: 정보를 얻고자 하는 객체 내 프로퍼티

let user = {
  name: 'Jinju'
};

let descriptor = Object.getOwnPropertyDescriptor(user, 'name');

alert( JSON.stringify(descriptor, null, 2 ) );

/* property descriptor:
{
  'value': 'Jinju',
  'writable': true,
  'enumerable': true,
  'configurable': true
}
*/

- 플래그 변경

Object.defineProperty를 사용하면 플래그 변경 가능

Object.defineProperty(obj, propertyName, descriptor);

obj, propertyName: 설명자를 적용하고 싶은 객체와 객체프로퍼티
descriptor: 적용하고자 하는 프로퍼티 설명자

defineProperty메서드는 객체에 해당 플래그 정보가 없으면 플래그 값을 자동으로 false로 만든다

let user = {};

Object.defineProperty(user, 'name', {
  value: 'Jinju'
});

let descriptor = Object.getOwnPropertyDescriptor(user, 'name');

alert( JSON.stringify(descriptor, null, 2 ) );

/*
{
  'value': "John",
  'writable': false,
  'enumerable': false,
  'configurable': false
}
 */

0개의 댓글