자바스크립트 객체는 크게, 3가지 객체로 분류됩니다.
표준 빌트인 객체
: ECMAScript 사양에 정의된 객체를 의미, 애플리케이션 전역에 공통 기능을 제공, 전역 객체의 프로퍼티로 제공되므로 별도의 선언 없이 전역 변수처럼 언제나 참조가능호스트 객체
: ECMAScript 사양에 정의되어 있지는 않지만, 브라우저 환경 or Node.js 환경에서 추가로 제공하는 객체를 의미사용자 정의 객체
: 사용자가 직접 정의한 객체를 의미표준 빌트인 객체는
인스턴스를 생성할 수 있는 생성자 함수 객체
입니다.
자바스크립트는 Object, String, Number, Boolean, Symbol, Array, Map/Set, Function
등 40여 개의 표준 빌트인 객체를 제공
프로토타입 메서드와 정적 메서드를 제공
이 중 Math, Reflect, JSON
는 정적 메서드만 제공
생성자 함수인 표준 빌트인 객체가 생성한 인스턴스의 프로토타입은 표준 빌트인 객체의 prototype 프로퍼티에 바인딩
String
을 생성자 함수로서 호출하여 생성한 String 인스턴스의 프로토타입은 Strign.prototype
const strObj = new String("WI");
console.log(Object.getPrototypeOf(strObj) === String.prototype); // true
표준 빌트인 객체의 prototype 프로퍼티에 바인딩된 객체는 다양한 기능의 빌트인 프로토타입 메서드를 제공
또한, 인스턴스 생성 없이도 호출 가능한 빌트인 정적 메서드 제공
// Number 생성자 함수에 의한 Number 객체 생성
const numObj = new Number(1.5);
// Number.prototype 에 프로토타입 메서드인 toFixed
console.log(numObj.toFixed()); // 2
// Number 빌트인 객체의 정적 메서드
console.log(Number.isInteger(0.5)); // false
문자열, 숫자, 불리언 같은
원시값
에 대해 객체처럼 접근하면 생성되는임시 객체
를래퍼 객체(wrapper object)
라고 합니다.
문자열, 숫자, 불리언 등의 원시값이 마치 객체처럼
마침표(.) 나 대괄호 표기법으로 접근하여 메서드를 호출할 수 있다.
일시적으로 원시값을 연관된 객체로 변환
해주기 때문연관된 객체를 생성하여 생성된 객체로 프로퍼티에 접근하거나 메서드를 호출하고 다시 원시값으로 되돌린다.
예 ) 문자열
원시값에 대해, 마침표 표기법으로 접근하면, 그 순간 래퍼 객체인 String 생성자 함수의 인스턴스가 생성되고, 문자열은 래퍼 객체의 [[StringData]] 내부 슬롯에 할당
const str = "Hello";
// 원시 타입인 문자열 -> 래퍼 객체인 String 인스턴스로 변환
console.log(str.length); // 5
console.log(str.toUpperCase()); // HELLO
// 래퍼 객체로 프로퍼티에 접근하거나 메서드를 호출한 후, 다시 원시값으로 되돌린다.
// 생성되었던 래퍼 객체는 "가비지 컬렉션"의 대상이 된다.
console.log(typeof str); // string << 🔎 String 표준 빌트인 생성자 함수 타입이 아니다.
래퍼 객체의 역할이 끝나면, 원시값은 다시 식별자에 연결되고 래퍼 객체는 가비지 컬렉션
의 대상이 된다.
// 식별자(변수) str은 'Hello' 문자열 원시값을 가진다.
const str = "Hello";
// 식별자 str은 암묵적으로 생성된 "래퍼 객체"를 가리킨다.
// 식별자 str의 값 'Hello' 는 래퍼 객체의 [[StringData]] 내부 슬롯에 할당된다.
// 래퍼 객체의 "name 프로퍼티가 동적 추가"된다.
str.name = "WI";
// 래퍼 객체의 역할이 끝나고, 식별자 str은 다시 래퍼 객체의 [[StringData]] 내부 슬롯에 할당된 원시값을 갖는다.
// 생성되었던 래퍼 객체는 아무도 참조하지 않게 되고, 가비지 컬렉션의 대상이 된다.
// 식별자 str 은 더 이상 래퍼 객체를 가리키고 있지 않다.
// 그러므로, 래퍼 객체에 추가된 name 프로퍼티는 더 이상 str 식별자로 접근할 수 없다. 즉 undefined 를 반환한다.
console.log(str.name); // undefined
// 실제로 식별자 str이 가리키는 데이터를 참조해보면 타입이 string 문자열이다.
console.log(typeof str, str); // string Hello
원시값 중 Number, String, Boolean
은 래퍼 객체를 가지며, ES6에 도입된 Symbol
또한 래퍼 객체를 가진다.
undefined, null
원시값은 래퍼 객체를 가지지 않는다. → 래퍼 객체처럼 사용 시 에러 발생