JavaScript 프로토타입 객체 관계도

🔗 프로토타입 체인 구조

┌─────────────────────────────────────────────────────────────────┐
│                    Function Constructor                          │
│  ┌─────────────────────────────────────────────────────────────┐ │
│  │                    Person                                   │ │
│  │                 (생성자 함수)                                 │ │
│  │                                                             │ │
│  │  • 함수도 객체이므로 __proto__ 프로퍼티를 가짐                │ │
│  │  • prototype 프로퍼티를 가짐 (함수만의 특별한 프로퍼티)        │ │
│  └─────────────────────────────────────────────────────────────┘ │
└─────────────────────────────────────────────────────────────────┘
                              │
                              │ prototype
                              ▼
┌─────────────────────────────────────────────────────────────────┐
│                    Prototype Object                             │
│  ┌─────────────────────────────────────────────────────────────┐ │
│  │                Person.prototype                             │ │
│  │                 (프로토타입 객체)                             │ │
│  │                                                             │ │
│  │  • constructor: Person (생성자 함수를 가리킴)                 │ │
│  │  • 공유할 메서드들이 여기에 정의됨                            │ │
│  │  • sayHello: function() { ... }                            │ │
│  └─────────────────────────────────────────────────────────────┘ │
└─────────────────────────────────────────────────────────────────┘
                              ▲
                              │ __proto__
                              │
┌─────────────────────────────────────────────────────────────────┐
│                      Instance                                   │
│  ┌─────────────────────────────────────────────────────────────┐ │
│  │                    person1                                  │ │
│  │                 (인스턴스 객체)                               │ │
│  │                                                             │ │
│  │  • name: "김철수"                                           │ │
│  │  • age: 30                                                  │ │
│  │  • __proto__: Person.prototype (프로토타입 객체를 가리킴)     │ │
│  └─────────────────────────────────────────────────────────────┘ │
└─────────────────────────────────────────────────────────────────┘

📋 주요 개념 정리

1. 생성자 함수의 prototype 프로퍼티

2. 인스턴스의 proto 프로퍼티

3. 프로토타입 객체의 constructor 프로퍼티

🔄 프로토타입 체인 동작 과정

person1.sayHello() 호출 시:

1. person1 객체에서 sayHello 메서드 검색 → ❌ 없음
2. person1.__proto__ (Person.prototype)에서 검색 → ✅ 발견!
3. Person.prototype.sayHello() 실행

💡 코드 예시

// 생성자 함수
function Person(name, age) {
    this.name = name;
    this.age = age;
}

// 프로토타입에 메서드 추가
Person.prototype.sayHello = function() {
    return `안녕하세요, 저는 ${this.name}입니다.`;
};

// 인스턴스 생성
const person1 = new Person("김철수", 30);
const person2 = new Person("이영희", 25);

// 관계 확인
console.log(person1.__proto__ === Person.prototype);        // true
console.log(Person.prototype.constructor === Person);       // true
console.log(person1.sayHello === person2.sayHello);        // true (같은 메서드 공유)

🎯 핵심 포인트