October 20, 2021
prototype
프로퍼티는 자바스크립트 내부에서도 광범위하게 사용됩니다. 모든 내장 생성자 함수에서 prototype
프로퍼티를 사용하죠.
첫 번째로 자세히 살펴본 다음 어떻게 내장 객체에 새 기능을 추가하여 프로토타입 프로퍼티를 사용하는지 알아보겠습니다.
obj = new Object()를 줄이면 obj = {}가 됩니다. 여기서 Object는 내장 객체 생성자 함수인데, 이 생성자 함수의 prototype은 toString을 비롯한 다양한 메서드가 구현되어있는 거대한 객체를 참조합니다.
let obj = {};
alert(obj.__proto__ === Object.prototype); // true
alert(obj.toString === obj.__proto__.toString); //true
alert(obj.toString === Object.prototype.toString); //true
Array
, Date
, Function
을 비롯한 내장 객체들 역시 프로토타입에 메서드를 저장해 놓습니다.
배열 [1, 2, 3]
을 만들면 기본 new Array()
생성자가 내부에서 사용되기 때문에 Array.prototype
이 배열 [1, 2, 3]
의 프로토타입이 되죠. Array.prototype
은 배열 메서드도 제공합니다. 이런 내부 동작은 메모리 효율을 높여주는 장점을 가져다줍니다.
명세서에선 모든 내장 프로토타입의 꼭대기엔 Object.prototype
이 있어야 한다고 규정합니다. 이런 규정 때문에 몇몇 사람들은 "모든 것은 객체를 상속받는다."라는 말을 하죠.
let arr = [1, 2, 3];
// arr은 Array.prototype을 상속받았나요?
alert( arr.__proto__ === Array.prototype ); // true
// arr은 Object.prototype을 상속받았나요?
alert( arr.__proto__.__proto__ === Object.prototype ); // true
// 체인 맨 위엔 null이 있습니다.
alert( arr.__proto__.__proto__.__proto__ ); // null
Array.prototype
, Object.prototype
, Date.prototype
등).Number.prototype
, String.prototype
, Boolean.prototype
같은 메서드를 저장합니다. undefined
와 null
값은 래퍼 객체를 가지지 않습니다.