객체 간의 상속을 구현하는 JS 의 방식
자바스크립트 객체가 상속처럼 동작할 수 있게 해주는 연결 구조
관련 키워드 (마인드맵 형태로 나열):
[Prototype]├── [[Prototype]]│ ├── __proto__ (접근자)│ └── Object.getPrototypeOf()├── Constructor│ └── prototype (생성자 속성)├── Prototype Chain│ ├── 상속 구조│ └── Object.prototype → null├── 메서드 공유└── class (문법적 설탕, syntactic sugar)
⚠️ 단순 복붙 금지! 반드시 자신의 말로 재작성할 것
개념 설명 (내 말로):
자바스크립트에서 모든 객체는 ‘부모객체’를 갖고 있는데, 이게 프로토타입이다. 어떤 객체의 속성을 찾을 때 해당 객체에 없으면 자동으로 부모 객체인 프로토타입에서 찾게된다.
동작 원리 / 흐름:
실제 코드 예시:
프로토타입을 예시로 배워보자.
아래의 경우는 Box 함수를 통해 두 인스턴스를 만드는 예시이다.
둘 다 동일한 Box 함수를 기반으로 생성되어 동일함 함수를 복사해왔지만, 각 객체는 서로 다른 것이기에 getArea 라는 메서드를 서로 다른 것으로 인식한다.
function Box(width, height) {this.width = width; // 가로this.height = height; // 세로this.getArea = function() {
위 예시와 다르게 아래에는 Box함수의 프로토타입에 메서드를 추가했다
이렇게 되면 각 인스턴스가 생성될 때마다 해당 함수가 복사되는 것이 아닌, 각 인스턴스들이 해당 프로토타입을 상속받아 가져다쓸 수 있게 된다.
또한, 두 자식이 모두 동일한 부모에게서 같은 유전자(프로토타입)을 물려받은 개념이기에 동일한 메서드로 취급된다.
function Box(width, height) {this.width = width; // 가로this.height = height; // 세로}// Box 함수의 프로토타입에 getArea 메서드를 추가해 모든 인스턴스가 상속받아 사용할 수 있도록 한다Box.prototype.
개념 설명 (내 말로):
프로토타입들이 연결되어있는 걸 보고 체인구조라고 한다. 결국 속성 탐색을 할 때 해당 체인을 따라 탐색하게되는 것. 최상위 부모에는 Object.prototype이 존재하며, 그 위는 null이다.
동작 원리 / 흐름:
이렇게 부모를 계속해서 타고 가다보면 최종 종점은 Object.prototype 객체이고, Object.prototype의 프로토타입은 null이다.
→ 무한 루프 방지를 위함.

실제 코드 예시:
우리가 배열에서 사용하던 sort() 메서드나, length 프로퍼티가 있다.
분명 우리는 새로운 배열을 만드는 것인데 어떻게 항상 동일한 메서드나 프로퍼티가 있었을까?
이게 바로 프로토타입이었다!
배열이라는 부모 객체에 저 메서드들이 들어있고, 그것을 상속받아왔기에 사용가능한 것이다
// 실제로 컴퓨터는 아래처럼 생성자 함수로 인식한다.// const arr = new Array(3, 2, 5, 4);const arr = [3, 2, 5, 4];console.log(arr.sort()); // [ 2, 3, 4, 5 ]console
→ 만약 우리가 상속받아 사용하지 못했다면, 객체들을 만들 때마다 항상 프로퍼티나 메서드를 직접 추가해줬어야했을 것이다.
개념 설명 (내 말로):
자바스크립트에서 “프로토타입”이라고 부르는 것은 사실 하나가 아니라3가지 서로 다른 개념이 섞여 있는 것이다.
이걸 구분 못하면 계속 헷갈리게 된다.
const obj = {};// 내부적으로obj.[[Prototype]] === Object.prototype
이 기술/개념이 왜 이런 방식으로 만들어졌는지 배경을 이해하자
유사한 개념과 차이점 정리 (면접에서 자주 나오는 포인트)
| 구분 | 생성자 내 메서드 정의 | 프로토타입 메서드 정의 |
| 메모리 | 인스턴스마다 각각 할당 (낭비) | 프로토타입 객체에 1번 할당 (효율) |
| 성능 | 인스턴스 생성 속도가 느려질 수 있음 | 인스턴스 생성이 빠름 |
| 상속 | 상속이 구현되지 않음 | 프로토타입 체인으로 상속 가능 |
실제 프로젝트에서 마주칠 수 있는 상황
class Box {constructor(width, height) {this.width = width;this.height = height;}getArea()
면접관 앞에서 말하듯이 작성. 읽는 용도가 아니라 말하는 연습을 위한 섹션
[도입 - 핵심 정의 먼저]"프로토타입은 자바스크립트 객체가 속성이나 메서드를 상속받는 부모 객체입니다."[부연 - 왜/어떻게]"이것이 필요한 이유는 메서드를 모든 인스턴스에 복사하지 않고하나의 프로토타입 객체에 두어 메모리를 효율적으로 쓰기 위함입니다.동작 방식은, 객체에서 속성을 찾을 때 자기 자신 → 프로토타입 → 그 프로토타입...순으로 체인을 따라 올라가며 탐색하고, 최종적으로 null에 도달하면 undefined를 반환합니다."[마무리 - 실무 연결]"실제로 Array.prototype.map 같은 내장 메서드들도 이 체이닝 덕분에 모든 배열 인스턴스에서사용 가능하며, 저는 이 원리를 이해한 뒤 polyfill 구현이나 상속 구조 설계 시 활용했습니다."
면접관이 바쁠 때, 딱 1분 안에 설명하는 버전
프로토타입 = 자바스크립트 객체의 '부모 참조'→ 속성 탐색 시 자기 자신부터 null까지 체인을 따라 올라감→ 덕분에 메서드 한 번 정의로 모든 인스턴스 공유 가능→ __proto__(접근자) ≠ Func.prototype(생성자용 프로퍼티) 구분 주의
각 질문에 대해 STAR 구조 혹은 두 문장 요약으로 작성
자바스크립트에서 객체가 다른 객체의 속성과 메서드를 상속받을 수 있도록 하는 부모 객체입니다.
속성을 찾을 때 현재 객체에 없으면 프로토타입 체인을 따라 올라가며 탐색합니다.
__proto__ 는 모든 객체가 가지는 접근자이며 실제 프로토타입을 가리킵니다. 반면 prototype 은 생성자 함수가 가지는 속성으로, 인스턴스의 부모 역할을 합니다.
속성 탐색 성능 저하가 발생할 수 있습니다. 특정 속성을 찾기 위해 체인의 끝(null)까지 거슬러 올라가야 하므로, 존재하지 않는 속성에 접근하려 할 때 성능에 부정적인 영향을 줍니다. 실무에서는 hasOwnProperty를 사용해 객체 자신의 속성인지 확인하거나, 에디터 엔진처럼 성능이 중요한 곳에서는 상속 구조를 너무 깊게 설계하지 않는 것이 중요합니다.
function Foo() {}Foo.prototype.x = 1;const a = new Foo();Foo.prototype = { x: 2 }
출력은 1, 2입니다. a는 생성 시점의 원래 Foo.prototype(x=1)을 [[Prototype]]으로 이미 참조하고 있습니다. 이후 Foo.prototype이 새 객체로 교체되어도 a의 [[Prototype]]은 변경되지 않습니다. b는 교체된 새 prototype(x=2)을 참조합니다.
공부하고 나서 진짜 내 머릿속에 남은 것들만 정리
function Person() {}const p = new Person();console.log(p.__proto__ === Person.prototype); // true
Array.prototype.myMap = function(callback) {const result = [];for (let i = 0; i < this.length; i++) {result.push(callback(this[i], i, this));}return result;};