ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Javascript 이론] Object_함수는 일급객체, 함수 고유의 프로퍼티는?
    To infinity/Javascript 이론 2021. 7. 8. 10:34

    1. 일급객체

     

    다음 조건을 만족한다면, 넌, 일급객체다.

     

    • 무명의 리터럴로 생성가능. 즉, 런타임에 생성이 가능하다
    • 변수나 자료구조(객체, 배열 등)에 저장할 수 있다.

     

    • 함수의 매개변수에 전달할 수 있다.
    • 함수의 반환값으로 사용할 수 있다.

    => 함수형 프로그래밍을 가능케하는 자바스크립트의 장점

     

     

    바스크립트의 함수는 위 조건을 모두 충족하므로 일급객체다.

    즉, 함수를 객체와 동일하게 사용할 수 있다는 것이다.

    객체는 값이므로 함수는 값이다.

     

     

    함수객체는 일반객체에 없는 함수 고유의 프로퍼티를 소유한다.

     

    프로퍼티

     

    예를 들어보자

     

    __proto__ : Oject.prototype 객체의 프로퍼티 (접근자 프로퍼티)

    arguments, caller, length, name, prototype: 함수 객체 고유의 프로퍼티 (데이터 프로퍼티)

     

    함수도 객체이므로 객체의 프로퍼티를 상속받아 사용할 수 있는 것이다.

     

     

    2. 함수객체의 프로퍼티

     

    1) arguments 프로퍼티

    - 함수 호출 시 전달된 인수를 보관한다. (매개변수들을 보관한다)

      해당 형태로 보관 => 프로퍼티 키: 인수의 순서 / 프로퍼티 값: 인수

     

    - 많이 들어오면 많이 들어오는대로, 적게 들어오면 적게 들어오는대로 반환함.

    즉, 매개변수의 개수와 함수호출 시 전달하는 인수의 개수를 확인하지 않음.

    따라서 들어오는 인수의 개수를 확인하지 않으므로 가변인자함수를 구현할 때 유용

     

    - arguments 프로퍼티는유사배열객체이므로 length프로퍼티가 있으므로 for문 순회 가능하다.

    하지만 배열이 아니기 때문에 배열 메서드를 사용하면 에러가 발생하므로 Function.prototype.call / apply를 사용해 간접호출 해야한다.

    // arguemtns를 배열로 변환하기 위해 간접호출

    function sum( ) {
        const array = Array.prototype.slice.call(arguements);
        return array.reduce(function (pre, cur) {
           return pre + cur;
        }, 0);
    }

     

    - 번거로우니 ES6에서는 Rest 파라미터를 도입했다. 따라서 Rest 파라미터를 사용하면 객체를 배열로 변환해줄 필요가 없다. (간접호출하지 않아도 된다)

    function sum(...args) {
       return args.reduce((pre,cur) => pre + cur, 0);
    }

     

    2) caller 프로퍼티

     

    ECMAScript 사양에 포함되지 않은 비표준 프로퍼티

    Passsss

     

    3) length 프로퍼티

     

    함수 정의 시 선언한 매개변수의 개수

    arguments 객체의 length 프로퍼티 값과 함수 객체의 length 프로퍼티 값은 다를 수 있으니 주의하자.

     

    4) name 프로퍼티

     

    함수의 이름을 나타냄

     

    익명함수 표현식의 경우에는 ES5와 ES6의 동작이 다르다.

     

    var anonymousFunc = function( ) { };

    // ES5 : 빈 문자열
    // ES6: anonymous

     

    ES5: 프로퍼티 값은 빈 문자열

    ES6: 프로퍼티 값은 함수객체를 가리키는 변수이름

     

     

    5) __proto__ 접근자 프로퍼티

    모든 객체는 [[Prototype]] 이라는 내부슬롯을 갖고 이 슬롯은 객체지향 프로그래밍의 상속을 구현하는 프로토타입 객체를 가리킨다.

     

    __proto__ 프로퍼티는 [[Prototype]] 내부슬롯이 가리키는 프로토타입 객체에 접근하기 위해 사용하는 접근자 프로퍼티다. 왜냐면 직접 내부슬롯에 접근할 수 없기 때문이다.

     

     

    6) prototype 프로퍼티

    생성자 함수로 호출할 수 있는 함수객체, 즉 constructor만이 소유하는 프로퍼티다.

    생성자 함수가 생성할 인스턴스의 프로토타입 객체를 가리킨다.

     

     


    요약

     

    객체는 객체의 프로퍼티가 존재한다. (접근자 프로퍼티, __proto__)

     

    함수는 일급객체이다.

    함수도 객체이므로 객체의 프로퍼티를 상속받는다.

    하지만 다른 객체와는 다르게 함수객체의 고유의 프로퍼티도 존재한다.

     

    함수객체 고유의 프로퍼티는 arguments, caller, length, name, prototype (생성자 함수로 호출하는 함수객체만) 가 있다.

     

    함수객체 프로퍼티 조회 arguemtns caller length name prototye
    (생성자 함수로 호출하는 함수객체만)
    __proto__
    함수객체 고유의 프로퍼티 arguemtns caller length name prototype  
    객체의 프로퍼티           __proto__

     

Designed by Tistory.