본문 바로가기
JavaScript Study

JavaScript - #21. 일급객체

by KMS_99 2023. 9. 18.

JavaScript - #21. 일급객체

일급객체의 조건은 다음과 같다.

1. 무명의 리터럴로 생성이 가능, 런타임때 생성이 가능하다.

2. 변수나 자료구조에 저장이 가능하다.

3. 함수의 매개변수에 전달할 수 있다.

4. 함수의 반환값으로 사용할 수 있다.

 

자바스크립트의 함수는 일급객체의 조건을 만족하기 때문에 일급객체이다.

따라서 함수는 객체의 특성을 모두 가지며, 일반객체와 다른 점은

호출가능, 함수 고유의 프로퍼티 소유이다.

 

함수의 고유 프로퍼티를 살펴보자

function func1 (arg1) {
    return arg1 * arg1; 
}

console.dir (func1);

console.dir를 통해 함수객체의 프로퍼티를 확인할 수 있다.

함수 객체의 프로퍼티

각 프로퍼티별 Object.getownpropertyDiscriptors 메서드로 확인한 프로퍼티 어트리뷰트는 다음과 같다.

함수 객체 프로퍼티 어트리뷰트

각 프로퍼티가 어떤것인지 확인해보자.

 

1. arguments

arguments의 프로퍼티 값은 arguments 객체이다.

함수의 호출시 전달된 인수들의 정보를 담고 있으며, 순회가 가능한 유사배열 객체이다.

함수 내부에서 지역변수처럼 사용된다.

function func1 (arg1) {
    console.log(arguments);
    return arg1 * arg1; 
}

func1('인수1','인수2');


console.dir (func1);

 

arguments 객체

다음 코드와 결과를 확인하였을 때,

분명 매개변수가 1개이지만, 초과된 인수의 정보도 arguments 객체에 프로퍼티로 포함된 것을 볼 수있다.

따라서 arguments 프로퍼티를 이용하면, 매개변수의 개수를 확정하지 않는 가변인자함수를 구현할 수 있다.

function func1 (arg1) {
    if (arguments.length < 3){
        return '3 under';
    }
    else  {
        return '3 over';
    }
}
console.log(func1('인수1','인수2')); //3 under
console.log(func1('인수1','인수2','인수3','인수4')); //3 over

arguments 객체는 length 프로퍼티를 가진 객체이다.

length프로퍼티를 가졌으며, 반복문으로 순회가 가능한 객체를 유사 배열 객체라고 한다. (배열x)

유사 배열 객체는 배열이 아니기 때문에 배열 메서드를 사용하면 에러가 발생한다.

따라서 FUnction.prototype.call / apply / bind 메서드를 애용하여 간접 호출을 해야한다.

이 내용은 추후에 배울 예정이다.

다만, 위와 같은 번거로움을 덜기 위해 ES6 문법에서는 Rest 파라미터를 도입하였다는 것만 알아두자.

 

2. caller 프로퍼티

caller 프로퍼티는 ECMAScript 사양에 포함되지 않은 비표준 프로퍼티이다. 

해당 caller 프로퍼티는 자신을 호출한 함수를 가리킨다.

즉 재귀함수에서 모체가 되는 함수를 나타낸다.

해당 프로퍼티는 비표준 프로퍼티이기 때문에 이정도만 알아두자.

 

3. length 프로퍼티

함수 객체의 length 프로퍼티는 함수를 정의할 때 정의한 매개변수의 수를 나타낸다.

arguments 객체의 length 프로퍼티는 인수의 개수을 가리킨다. 둘의 차이를 분명히 알아야 하겠다.

 

4. name 프로퍼티

함수 객체의 이름을 나타낸다.

익명함수는 함수 객체를 가리키는 함수의 식별자를 name 프로퍼티로 가진다.

 

5. __proto__ 접근자 프로퍼티

모든 객체가 갖는 내부 슬롯인 [[Prototype]]에 간접적으로 접근하기 위해서는 __proto__ 접근자 프로퍼티를 사용해야한다.

__proto__ 프로퍼티는 [[Prototype]] 내부슬롯이 가리키는 프로토타입객체에 접근하기 위해 사용하는 프로퍼티이다.

 

6. prototype 프로퍼티

prototype 프로퍼티는 생성자함수로 호출될 수 있는 함수객체가 소유하는 프로퍼티이다.

즉, constructor가 소유하며, non-constructor은 소유하지 않는다.

hasOwnProperty()는 프로퍼티를 가졌는지 확인하는 메서드이다.

function func1 (arg1) { }

console.log(func1.hasOwnProperty('prototype')); // true
console.log({}.hasOwnProperty('prototype')); // false