화살표 함수는 단지 함수를 짧게 쓰기위한 용도로 사용되지 않는다
JavaScript 사용 시에 멀리 떨어진 곳에서 실행될 작은 함수를 작성하고 그 함수를 어딘가에 전달하게 되면 컨텍스트를 잃을 수 있는 가능성이 높아진다
👉 화살표 함수를 사용하면 현재 컨텍스트를 잃지 않아 편리하다
this
를 가지지 않는다arguments
를 지원하지 않는다new
와 함께 호출할 수 없다super
가 없다화살표 함수 본문에서 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
를 지원하지 않는다
👉 현재 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
면 readonlyenumerable
- 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
}
*/