ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 모던 자바스크립트 Deep dive - 프로토타입 ( 리터럴 표기법 )
    JavaScript 2021. 9. 23. 20:58

    리터럴 표기법에 의해 생성된 객체의 생성자 함수와 프로토타입


    생성자 함수에 의해 생성된 인스턴스는 프로토타입의 constructor 프로퍼티에 의해 생성자 함수와 연결된다.

    const obj = new Object();
    
    console.log(obj.constructor === Object); // true

     

    리터럴 표기법에 의해 생성된 객체도 물론 프로토타입이 존재한다.
    하지만, 리터럴 표기법에 의해 생성된 객체의 경우 프로토 타입의 constructor 프로퍼티가 가리키는 생성자 함수가 반드시 객체를 생성한 생성자 함수라고 단정할 수는 없다.

    const obj = {};
    
    console.log(obj.constructor === Object); // true

     

    obj 객체는 객체 리터럴 표기법에 의해 생성되었고,
    obj는 Object 생성자 함수와 constructor로 연결되었다.

    그럼, 객체 리터럴 표기법은 Object 생성자 함수로 생성되는 것일까?

    ECMAScript 사양에 의하면,

    • 객체 리터럴이 평가될 때는 추상 연산 OrdinaryObjectCreate를 호출하여 빈 객체를 생성하고 프로퍼티를 추가하도록 정의되어 있다.
    • Object 생성자 함수에 인수를 전달하지 않거나 undefined, null 을 인수로 전달하면서 호출하게되면
      OrdinaryObjectCreate를 호출하여 Object.prototype을 프로토타입으로 갖는 빈 객체를 생성한다.

    객체 리터럴과 Object 생성자 함수는 OrdinaryObjectCreate를 호출하여 빈 객체를 생성하는 점에서 동일하나 프로퍼티를 추가하는 처리 등 세부 내용은 다르다.

    즉, 객체 리터럴에 의해 생성된 객체는 Object 생성자 함수로 생성한 객체가 아니지만, OrdinaryObjectCreate를 호출하여 빈 객체를 생성하는 점은 동일하다.

    ( {}.constructor === Object 가 true ) 는 리터럴 표기법에 의해 생성된 객체도 상속을 위해 프로토타입이 필요하기 때문에 가상적인 생성자 함수를 갖는다. 따라서, 프로토타입과 생성자 함수는 쌍으로 존재한다.

    정리

    리터럴에 의해 생성된 객체는 생성자 함수에 의해 생성된 객체는 아니다.
    하지만, 생성자 함수와 같이 OrdinaryObjectCreate로 빈 객체를 생성하는 점에서 동일하여 큰 차이가 없다.
    그리고, 객체들은 상속을 위해 프로토타입이 필요하기 때문에 가상적인 생성자 함수를 갖기 때문에 {}.constructor === Object가 true이다.

     

     

    댓글

Designed by Tistory.