18.1 일급 객체
일급 객체의 조건
•
무명의 리터럴로 생성 가능 ( 런타임에 생성 가능 )
•
변수나 자료구조에 저장 가능
•
함수의 매개변수에 전달 가능
•
함수의 반환값으로 사용 가능
일급 객체란 함수를 객체와 동일하게 사용할 수 있다는 의미이며, 함수는 값과 동일하게 취급할 수 있습니다.
단 함수는 객체이지만 일반 객체와 차이점이 존재하는데 일반 객체는 호출할 수 없지만 함수 객체는 호출할 수 있습니다. 또한 함수 고유의 프로퍼티를 소유합니다.
18.2 함수 객체의 프로퍼티
함수의 프로퍼티는 Object.getOwnPropertyDescripotors 메서드로 확인 해보면 아래와 같이 나옵니다.
arguments, caller, length, name, prototype은 모두 함수 객체의 데이터 프로퍼티입니다. 이들은 일반 객체에는 없는 것입니다. 단 “__proto__”는 Object.prototype 접근자 프로퍼티입니다.
18.2.1 arguments 프로퍼티
함수 호출 시 전달된 인수들의 정보를 담고 있는 유사 배열 객체로 함수 내부에서 지역 변수 처럼 사용된다. 모든 인수는 암묵적으로 arguments 객체의 프로퍼티로 보관되며 실제- 배열이아닌 유사 배열 객체입니다. 이는 가변 인자 함수를 구현할 때 유용한데, for문으로 순회할 수 있습니다.
function sum(){
let res = 0;
for(let i = 0; i < arguments.length; i++) {
res += arguments[i];
}
return res;
}
JavaScript
복사
또한 실제 배열이 아니므로 매열 메서드를 사용할 경우 에러가 발생하며, 필요한 경우 Function.prototype.call, Function.prototype.apply를 사용해 간접 호출해야 한다. 이러한 문제를 해결하기 위해서 ES6에서는 Rest 파라미터가 도입되었다.
function sum(...args){
return args.reduce((pre, cur) => pre + cur, 0);
}
JavaScript
복사
18.2.2 caller 프로퍼티
caller는 비표준으로 크게 중요한 프로퍼티는 아니다.
function foo(func){
return func()
}
function bar(){
return 'caller : ' + bar.caller;
}
console.log(foo(bar)); // caller: function foo(func) {...}
JavaScript
복사
18.2.3 length 프로퍼티
함수를 정의할 때 서용한 매개변수의 갯수다. 단 arugmnets 객체의 length와 함수 객체의 length는 다를 수 있습니다.
18.2.4 name 프로퍼티
함수의 이름을 나타내며 ES5와 ES6는 동작이 다르다. 익명 함수의 경우 ES5에서는 name 프로퍼티는 빈 문자열을 값으로 가지고, ES6에서는 함수 객체를 가리키는 식별자를 값으로 가진다.
var anonymousFunc = function(){};
// ES5: name 프로퍼티는 빈 문자열을 값으로 가진다.
// ES6: name 프로퍼티는 함수 객체를 가리키는 변수 이름을 값으로 거진다.
JavaScript
복사
18.2.5 __proto__ 접근자 프로퍼티
__proto__ 프로퍼티는 [[Prototype]] 내부 슬롯이 가리키는 프로토타입 객체에 접근하기 위해 사용한다. 단 직접 접근이 아닌 간접적으로 접근하는 방식이다.
18.2.6 prototype 프로퍼티
생성자 함수로 호출 할 수 있는 함수 객체, 즉 constructor만이 소유하는 프로퍼티로, 일반 객체와 생성자 함수로 호출할 수 없는 non-constructor에는 prototype 프로퍼티가 없다.