핵심 정리
18장 함수와 일급 객체
다음과 같은 조건을 맍고하는 객체를 입급 객체라 합니다.
1. 무명의 리터럴로 생성할 수 있다. 즉, 런타임에 생성이 가능하다.
2. 변수나 자료구조(객체, 배열 등)에 저장할 수 있다.
3. 함수의 매개변수에 전달할 수 있다.
4. 함수의 반환값으로 사용할 수 있다.
자바스크립트의 함수는 다음 예제와 같이 위의 조건을 모두 만족하므로 일급 객체입니다.
함수가 일급 객체라는 것은 함수를 객체와 동일하게 사용할 수 있다는 의미입니다.
브라우저 콘솔에서 console.dir 메서드를 사용하여 함수 객체의 내부를 들여다 볼 수 있습니다.
함수 객체 내부에서 보이듯이 arguments, caller, length, name, prototype 프로퍼티는 모두 함수 객체의 데이터 프로퍼티입니다.
이들 프로퍼티는 일반 객체에는 없는 함수 객체 고유의프로퍼티입니다.
arguments 프로퍼티
arguments 객체는 배열 형태로 인자 정보를 담고 있지만 실제 배열이 아닌 유사 배열 객체입니다.
유사 배열 객체란 length 프로퍼티를 가진 객체로 for 문으로 순회할 수 잇는 객체를 말합니다.
유사 배열 객체는 배열이 아니므로 배열 메서드를 사용할 경우 에러가 발생합니다.
배열 메서드를 사용하려면 Function.prototype.call, Function.prototype.apply를 사용해 간접 호출해야 합니다.
ES6에서는 Rest 파라미터를 도입해서 번거로움을 해결하였습니다.
function sum(...args) {
return args.reduce((pre, cur) => pre + cur,0);
}
console.log(sum(1,2)); // 3
console.log(sum(1,2,3,4,5)); // 15
caller 프로퍼티
ECMAScript 사양에 포함되지 않는 비표준 프로퍼티입니다. 이후 표준화될 예정도 없는 프로퍼티이므로 사용하지 말고 참고만 하시면 될 것 같습니다.
length 프로퍼티
함수 객체의 length 프로퍼티는 함수를 정의할 때 선언한 매개변수의 개수를 가리킵니다.
function foo() {}
console.log(foo.length); // 0
function bar(x) {}
console.log(bar.length); // 1
name 프로퍼티
함수 객체의 name 프로퍼티는 함수 이름을 나타냅니다. name 프로퍼티는 ES6 이전까지는 비표준이었다가 ES6에서 정식 표준이 되었습니다.
__proto__ 접근자 프로퍼티
모든 객체는 [[Prototype]]이라는 내부 슬록을 갖습니다. [[Prototype]] 내부 슬롯은 객체지향 프로그래밍의 상속을 구현하는 프로토타입 객체를 가리킵니다.
__proto__ 프로퍼티는 [[Prototype]] 내부 슬록이 가리키는 프로토타입 객체에 접근하기 위해 사용하는 접근자 프로퍼티입니다.
내부 슬롯에는 직접 접근할 수 없고 간접적인 접근 방법을 제공하는 경우에 한하여 접근할 수 있습니다.
prototype 프로퍼티
prototype 프로퍼티는 생성자 함수로 호출할 수 있는 함수 객체, 즉 constructor만이 소유하는 프로퍼티입니다.
일반 객체와 생성자 함수로 호출할 수없는 non-constructor에는 prototype 프로퍼티가 없습니다.
'Javascript' 카테고리의 다른 글
처음부터 시작하는 javascript deep dive(22. this) (0) | 2024.02.20 |
---|---|
처음부터 시작하는 javascript deep dive(19. 프로토타입) (0) | 2024.02.04 |
처음부터 시작하는 javascript deep dive(15. let, const 키워드와 블록 레벨 스코프) (0) | 2024.01.29 |
처음부터 시작하는 javascript deep dive(14.전역 변수의 문제점) (0) | 2024.01.21 |
처음부터 시작하는 javascript deep dive(13.스코프) (1) | 2024.01.21 |