prototype 프로퍼티는 자바스크립트 내부에서 광범위하게 사용된다.
모든 내장 생성자 함수에서 prototype 프로퍼티를 사용한다.
Object.prototype
빈 객체를 생성해보자.
let obj = {};
alert( obj ); // "[object Object]" ?
"[Object Object]" 문자열을 생성하는 코드는 어디에 있는걸까?
obj는 비어 있는데 말이다.
obj = new Object()를 줄이면 obj = {} 가 된다.
여기서 Object는 내장 객체 생성자 함수인데, 이 생성자 함수의 prototype은 toString을 비롯한 다양한 메서드가 구현되어 있는 거대한 객체를 참조한다.
new Object()를 호출하면 새롭게 생성된 객체의 Prototype 은 Object.prototype을 참조한다.
따라서 obj.toString()을 호출하면 Object.prototype에서 해당 메서드를 가져오게 된다.
예시를 통해 확인해 보자.
let obj = {};
console.log(obj.__proto__ === Object.prototype); // true
console.log(obj.toString === obj.__proto__.toString); //true
console.log(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을 상속받았나요?
console.log( arr.__proto__ === Array.prototype ); // true
// arr은 Object.prototype을 상속받았나요?
console.log( arr.__proto__.__proto__ === Object.prototype ); // true
// 체인 맨 위엔 null이 있습니다.
console.log( arr.__proto__.__proto__.__proto__ ); // null
체인 상의 프로토타입엔 중복 메서드가 있을 수 있다.
Array.prototype엔 요소 사이에 쉼표를 넣어 요소 전체를 합친 문자열을 반환하는 자체 메서드 toString이 있다.
let arr = [1, 2, 3]
console.log(arr); // 1,2,3 <-- Array.prototype.toString의 결과
그런데 Object.prototype에도 메서드 toString이 있다. 이렇게 중복 메서드가 있을 때는 체인 상에서 가까운 곳에 있는 메서드가 사용된다. Array.prototype 이 체인 상에서 더 가깝기 때문에 예시에서는 Array.prototype의 toString이 사용된다.
Chrome 개발자 콘솔과 같은 도구를 사용해 console.dir를 사용하면 내장 객체의 상속 관계를 확인할 수 있다.
배열이 아닌 다른 내장 객체들 또한 같은 방법으로 동작한다.
함수도 마찬가지며 call, apply를 비롯한 함수에서 사용할 수 있는 메서드는 Function.prototype에서 받아온다.
function f() {}
console.log(f.__proto__ == Function.prototype); // true
console.log(f.__proto__.__proto__ == Object.prototype); // true, 객체에서 상속받음
'Javascript' 카테고리의 다른 글
[Javascript] 자료형 (0) | 2024.08.24 |
---|---|
[Javascript] 화살표함수 (0) | 2024.08.22 |
[Javascript] Random - 난수 생성하기 (0) | 2024.08.21 |
[Javascript] Map (0) | 2024.08.19 |
[Javascript] 소수 올림, 내림, 반올림 (0) | 2024.08.19 |