home강의 홈으로
Section 13. 프로토타입
Lesson 1. 프로토타입의 개념

👉 MDN 문서 보기



I. 프로토타입 prototype

  • 자바스크립트는 프로토타입 기반의 객체지향 프로그래밍을 지원하는 언어
  • 오늘날에는 클래스가 더 널리 사용되지만, 사용하기에 따라 보다 강력하고 효율적

⭐ 자바스크립트의 모든 객체는 Prototype을 가짐

const obj = {}; console.log(obj);
  • [[Prototype]] 펼쳐서 살펴볼 것

console.log( obj.toString() ); console.log( obj.valueOf() );
  • 빈 객체임에도 위의 메서드들이 사용 가능한 것은 프로토타입 때문




II. Object - 모든 것의 조상

  • 아래 각 객체의 [[Prototype]][[Prototype]]Object임 확인
  • [[Prototype]]의 메서드들 확인
console.log( new String('') ); console.log( [] ); console.log( new Map() );
  • constructor 항목에서 각각의 생성자 확인 가능

    • 객체 리터럴({} 등)의 생성자는 Object()임 알 수 있음
console.log( {} );

💡 프로토타입 체인

  • 특정 객체에 호출된 프로퍼티가 없다면 프로토타입을 거슬러 올라감
  • 예: Array에는 valueOf가 없지만 그 프로토타입인 Object에는 있으므로 호출 가능

img





II. 코드로 프로토타입에 접근하기

1. __proto__ 접근자 사용 - Object.prototype의 프로퍼티

  • 👉 MDN 문서 보기
  • ⚠️ Deprecated - 사라질 기능, 사용 권장되지 않음. 위의 링크 확인
console.log( {}.__proto__ ); console.log( new Number(2).__proto__ ); console.log( [1, 2, 3].__proto__ );

💡같은 종류는 프로토타입 공유 확인

console.log( {}.__proto__ === { x: 1, y: 2 }.__proto__ ); console.log( [1, 2, 3].__proto__ === [4, 5].__proto__ ); console.log( new String('가나다').__proto__ === new String('ABC').__proto__ );

💡최상위, 공통조상은 Object임 확인

console.log( {}.__proto__ === [].__proto__, {}.__proto__ === new Number(0).__proto__, [].__proto__ === new Number(0).__proto__ ); console.log( {}.__proto__ === [].__proto__.__proto__, {}.__proto__ === new Number(0).__proto__.__proto__, [].__proto__.__proto__ === new Number(0).__proto__.__proto__ ); // ⭐ 그 위로는 null console.log( {}.__proto__.__proto__ );


2. Object.getPrototypeOf

  • 수정할 때는 Object.setPrototypeOf 사용
  • __proto__ 대신 이 기능을 사용할 것
console.log( Object.getPrototypeOf({}) ); console.log( Object.getPrototypeOf([]) === [].__proto__ );


3. ⭐ 생성자 함수에서는 prototype으로 프로토타입 접근 가능

  • function으로 선언된 함수들에서
function Person (name) { this.name = name; } // 인스턴스들에 공유될 프로토타입에 다음과 같이 접근 console.log(Person.prototype); const hong = new Person('홍길동'); console.log(hong);
  • [[Prototype]]이 두 단계로 있음 확인 (Person - Object)



console.log( String.prototype ); console.log( Number.prototype ); console.log( Set.prototype ); // 생성자 함수로 동작하지 않는 빌트인 객체 console.log( Math.prototype );



IV. 인스턴스 vs 프로토타입 프로퍼티

🔗 5-2강 예제 다시보기

function YalcoChicken (name, no) { this.name = name; this.no = no; this.introduce = function () { return `안녕하세요, ${this.no}호 ${this.name}점입니다!`; } } const chain1 = new YalcoChicken('판교', 3); // 본사에서 새 업무를 추가 YalcoChicken.prototype.introEng = function () { return `Welcome to Yalco Chicken at ${this.name}!`; }; console.log(chain1.introEng()); console.log(new YalcoChicken('강남', 17).introEng());

⭐ 인스턴스의 로그를 펼쳐 각 함수가 속한 레벨 확인

console.log(chain1);
  • introduce : 만들어지는 인스턴스마다 각각 있음
  • introEng : 프로토타입에만 있음 - 메모리 절약


💡 따라서 메모리 사용을 최소화하려면 아래와 같이 작성

function YalcoChicken (name, no) { this.name = name; this.no = no; } // 공통된 요소들은 프로토타입 프로퍼티로 YalcoChicken.prototype.titleEng = 'YalcoChicken'; YalcoChicken.prototype.introduce = function () { return `안녕하세요, ${this.no}호 ${this.name}점입니다!`; } YalcoChicken.prototype.introEng = function () { return `Welcome to ${this.titleEng} at ${this.name}!`; }; const chain1 = new YalcoChicken('판교', 3); const chain2 = new YalcoChicken('강남', 17); const chain3 = new YalcoChicken('제주', 24); console.log(chain1.introduce()); console.log(chain1.introEng()); // 인스턴스 레벨과 프로토타입 프로퍼티들 비교 console.log(chain1, chain2, chain3);

💡 프로토타입 레벨의 함수를 인스턴스 레벨에서 덮어쓰기 가능

const chain4 = new YalcoChicken('평양', 456); chain4.introduce = function () { return `어서오시라요, ${this.no}호 ${this.name}점입네다!`; } console.log(chain4.introduce());


⭐ 클래스에도 적용 가능

class Dog { constructor (name) { this.name = name; } } Dog.prototype.sound = '멍멍'; Dog.prototype.bark = function () { // 메서드로 만드는 것과 같음 console.log(this.sound) }; const badugi = new Dog('바둑이'); badugi.bark(); console.log(badugi);
  • 프로토타입 확인

🤔얄코에게 질문하기질문은 반.드.시 이리로 보내주세요! ( 강의사이트 질문기능 ✖ )

강의에서 이해가 안 되거나 실습상 문제가 있는 부분,
설명이 잘못되었거나 미흡한 부분을 메일로 알려주세요!

답변드린 뒤 필요할 경우 본 페이지에
관련 내용을 추가/수정하도록 하겠습니다.

이메일 주소
yalco@yalco.kr
메일 제목 (반드시 아래 제목을 붙여넣어주세요!)
[질문] 제대로 파는 자바스크립트 (유료 파트) 13-1

🛑질문 전 필독!!

  • 구글링을 먼저 해 주세요. 들어오는 질문의 절반 이상은 구글에 검색해 보면 1분 이내로 답을 찾을 수 있는 내용들입니다.
  • 오류 메시지가 있을 경우 이를 구글에 복붙해서 검색해보면 대부분 짧은 시간 내 해결방법을 찾을 수 있습니다.
  • 강의 페이지에 추가사항 등 놓친 부분이 없는지 확인해주세요. 자주 들어오는 질문은 페이지에 추가사항으로 업데이트됩니다.
  • "유료파트의 강의페이지는 어디 있나요?" - 각 영상의 시작부분 검은 화면마다 해당 챕터의 강의페이지 링크가 있습니다.
  • 질문을 보내주실 때는 문제가 어떻게 발생했고 어떤 상황인지 등을 구체적으로 적어주세요. 스크린샷을 첨부해주시면 더욱 좋습니다.
🌏 Why not change the world?