LHJ

I'm a FE developer.

8-4. Number 오브젝트 / Number 인스턴스 생성, 인스턴스 형태

22 Nov 2020 » js_beginner

47. Number 인스턴스 생성, 인스턴스 형태

Number 인스턴스 생성

new Number()

구분데이터(값)
파라미터값opt
반환생성한 Number 인스턴스

  • 빌트인 Number 오브젝트로

    • 새로운 Number 인스턴스를 생성

        var obj = new Number("123");
        console.log(obj.valueOf()); // 123
      
      1. 빌트인 Number 오브젝트로 인스턴스를 생성하여 반환
      2. 파라미터 값이 문자열이면 숫자로 변환하여
      3. 생성한 인스턴스에 파라미터 값을 설정

Number(“123”) 이면 문자열 “123”을 숫자 123으로 변환합니다.
거기에 new 연산자를 붙여 인스턴스를 생성한 것입니다.
이렇게 생성된 인스턴스에 valueOf() 메서드를 실행하면 할당된 값을 반환합니다.


  • 인스턴스 형태
window.onload = function () {
    "use strict"
    
    debugger;

    var numberObject = Number;

    var obj = new Number("123");
    
    /*
    1. 새로 생성한 Number 인스턴스가 obj에 할당됩니다.
    
    2. 오른쪽 local 의 obj를 펼칩니다.
    1) __proto__가 있으며
    2) [[primitiveValue]]: 123이 있습니다.
    */

    debugger;

    var proto = obj.__proto__;

    /*
    3. __proto__ 를 펼칩니다.
    - 표시된 것은 빌트인 Number 오브젝트의 함수입니다.

    4. Number 인스턴스를 생성하는 목적은
    - 표시된 함수를 사용하기 위해서입니다.

    5. 인스턴스를 생성하지 않고 다른 방법으로
    - 함수를 사용할 수도 있습니다.
    */
}

obj 에는 __proto__[[primitiveValue]]말고는 없습니다.
나머지 빌트인 Number 오브젝트 관련된 것들은 하나도 없습니다. 바로 이것입니다.

인스턴스를 만들면 빌트인 Number 오브젝트에 있는 프로퍼티가 하나도 obj 로 넘어오지 않습니다.
단, 인스턴스에 설정되는 것이 있습니다.

obj 의 __proto__를 전개해보면 7개의 함수가 들어있는 것을 볼 수 있습니다.
이 함수들은 어디서왔을까요?
빌트인 Number 오브젝트?

아닙니다. 없습니다.
그럼 어디서 넘어온 것이냐.
바로 Number.prototype에 있습니다.

Number.prototype이랑 obj.__proto__에 있는 거랑 똑같습니다.
바로 이겁니다.
인스턴스를 만드는 기준은 prototype 이라는 오브젝트를 기준으로 해서 여기에 연결되어있는 것만 가져옵니다.
prototype과 같은 레벨에있는 isNaN 같은 것들은 인스턴스에 가져오지 않습니다.

빌트인 Number 오브젝트를 복사해서 주긴 주지만, prototype에 있는 것만 주는 겁니다.
그럼 나머지는 어떻게하냐.
그건 원본을 통해서 보라는 겁니다.

이것이 바로 인스턴스입니다.

정리

  1. 인스턴스를 만드는 기준은 prototype 입니다. prototype 에 연결되어있는 함수들을 복사해서 주는 것입니다.
  2. prototype 이 아닌 다른 것들은 복사를 안해줍니다. 이것이 인스턴스를 만드는 기준입니다.

__proto__ 이 또한 오브젝트입니다.
해당 __proto__ 안에도 { key: value } 프로퍼티 형태로 프로퍼티가 담겨져있기 때문입니다.
즉, prototype 안의 내용(프로퍼티)들을 인스턴스의 __proto__ 오브젝트로 그대로 주겠다는 겁니다.