[Javascript] 함수 총정리 ⑤ | 생성자 함수 역할로서의 빌트인 객체

Re_Go·2023년 12월 19일
0

Javascript

목록 보기
22/44
post-thumbnail

1. 빌트인 객체란?

빌트인 객체는 ECMAScript(자바스크립트의 표준화된 버전을 정의하는 스크립트 언어의 규격) 사양에 정의된 객체를 뜻하는데,해당 애플리케이션 전역(실행 환경)에 공통 기능을 제공하므로 자바스크립트 실행 환경(Node든 웹이든)과 관계없이 언제 어디서든 사용이 가능합니다.

이때 빌트인 객체는 전역 객체의 프로퍼티로서(웹에서는 window, node에서는 global) 제공되며 별도의 선언 없이 언제나 참조 가능합니다. 이는 호스트 객체(ESMAscript 사양에 정의되어 있지는 않으나 각종 실행 환경마다 제공되는 객체)나 사용자 정의 객체(사용자가 직접 정의한 객체)와는 구별되는 객체입니다.

2. 생성자 함수로서의 빌트인 객체

자바스크립트에서는 이러한 빌트인 객체 중 Math, Reflect, JSON을 제외한 모든 빌트인 객체를 통해 인스턴스를 생성할 수 있으므로 생성자 함수로가 봐도 무방하며, 프로토타입 메서드와 정적 메서드 또한 제공하는데, 이때 생성자 함수 객체가 아닌 Math, Reflect,JSON은 정적 메서드만을 제공하고 논외로 Symbo은 생성자 함수에서 제외 대상이므로 Symbol은 객체의 키에 대한 전용 빌트인 객체라고 보시는 것이 편합니다.

그리고 각각의 인스턴스를 생성 가능한 빌트인 객체에 의해 생성된 인스턴스들의 프로토타입은 해당 빌트인 객체들의 프로토타입을 상속 받게 되는데, 얘를 들어 String 빌트인 객체에 의해 생성된 인스턴스들은 String.prototype을 상속 받고, Number 빌트인 객체에 의해 생성된 인스턴스들은 Number.prototype을 상속 받게 됩니다.

한가지 중요한 사실은, 인스턴스들은 해당 생성자 함수(빌트인 객체)의 프로토타입을 상속받지만 동시에 인스턴스들은 또한 객체이고, 모든 객체들은 Object의 프로토타입을 상속 받기 때문에 Object 빌트인 객체의 인스턴스이기도 합니다.

이 말인 즉 빌트인 함수들 또한 객체이기 때문에 Object의 인스턴스들이라는 말이 되지요. (console.log(String instanceof Object);를 입력하면 true가 출력됩니다.)

① 빌트인 객체로 생성된 인스턴스의 프로토타입과 생성자 비교) 

const name = new String('Lee'); // String 타입의 name 인스턴스 생성시
console.log(typeof name); // 타입은 Object로 표시되는데
console.log(name instanceof String); // name은 String의 인스턴스 이므로 true를 반환하나
console.log(name instanceof Object); // 또한 Object의 프로토타입을 상속 받으므로 true를 반환합니다.
console.log(name.constructor === String); // 단 String에 의해 생성되었으므로 constructor는 동일하고
console.log(Object.getPrototypeOf(name) === String.prototype); // 또한 name의 프로토타입은 String.prototype의 프로토타입과 같은 반면에
console.log(name.constructor === Object); // Object에 의해 생성된 인스턴스가 아니므로 false를 반환하고
console.log(Object.getPrototypeOf(name) === Object.prototype); // name의 프로토타입은 String.protytpe 이기 때문에 이 또한 fasle를 반환합니다.

3. 래퍼 객체(Wrapper Object)

또한 변수에 담긴 원시값의 타입에 따라 해당 빌트인 객체의 메서드를 사용하는 것이 가능한데, 이는 자바스크립트 엔진에서 코드 실행 간에 해당 변수의 값을 객체에 감싸 임시적으로 해당 변수의 타입과 연관된 빌트인 객체의 메서드를 사용할 수 있도록 변환하는데, 이때 이 객체를 래퍼 객체(wrapper Object)라고 부릅니다.

얘를 들어 숫자값이 담긴 변수는 Number 메서드를, 문자 값이 담긴 변수는 String 메서드를, 배열이 담긴 변수는 Array 메서드를 사용 가능한 것처럼 말이죠.

const numObj = new Number(1.5); //Number 타입의 인스턴스 생성

consoel.log(numObj.toFixed()); // Number 메서드의 toFixed 메서드 호출

let number = 1.541; // number 변수에 원시값 저장 
console.log(number.toFixed(2)); // toFixed 메서드가 실행될 때 해당 원시값을 담고 있는 변수의 값을 일시적으로 해당 타입의 래퍼 객체로 변환 후 메서드를 사용합니다. 그래서 해당 변수는 Number 빌트인 객체의 메서드 사용이 가능한 것이죠. 물론 메서드 사용이 끝나면 래퍼 객체에서 다시 원래의 원시값으로 돌아오빈다.

console.log(Number.isInteger(0.5)) // 또한 빌트인 객체의 정적 메서드도 전역에서 사용이 가능하므로 인자를 비교하여 false를 반환합니다.
profile
인생은 본인의 삶을 곱씹어보는 R과 타인의 삶을 배워 나아가는 L의 연속이다.

0개의 댓글