화살표 함수는 단지 함수를 짧게 쓰기위한 용도로 사용되지 않는다
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
}
*/