HomeAboutMeBlogGuest
© 2025 Sejin Cha. All rights reserved.
Built with Next.js, deployed on Vercel
🐣
프론트엔드 데브코스 3기 교육생
/
📚
3기 스터디 가이드
/
🧑‍💻
CS 학습 및 면접대비 스터디
/
👀
프로토타입
👀

프로토타입

URL
발표자
은지
과목
Javascript

프로토타입

💡
자바스크립트는 프로토타입 기반 언어
프로토타입 기반 언어의 경우 객체를 원형(prototype)으로 삼아 이를 참조해서 상속과 비슷한 효과를 만들어낸다.
const Animal = function(species, birthYear) { this.species = species; this.birthYear = birthYear; } const tiger = new Animal('Siberian', 1234); console.log(tiger); // Animal {species: 'Siberian', birthYear: 1234} console.log(tiger instanceof Animal); // true
  1. 생성자 함수를 new 연산자와 함께 호출하면
  1. 생성자에 정의된 내용을 바탕으로 인스턴스가 생성된다.
  1. 인스턴스에는 자동으로 __proto__가 부여되고
  1. __proto__를 이용해서 생성자의 prototype 프로퍼티에 접근할 수 있다.
 
notion image
 

prototype

다른 클래스 언어와 같이 메서드를 작성하려면 ‘prototype’이 필요하다.
  • 만약 생성자 함수 내부에 메서드를 작성한 경우, 모든 인스턴스에 사용할지도 모르는 메서드가 항상 포함되므로 비효율적인 코드가 됨
 
prototype 객체 내부에는 인스턴스의 메서드가 저장된다.
Animal.prototype.calcAge = function () { console.log(2022 - this.birthYear); } // 메서드 접근 console.log(Animal.prototype); // {calcAge: ƒ, constructor: ƒ} console.log(tiger.__proto__); // {calcAge: ƒ, constructor: ƒ} console.log(Animal.prototype === tiger.__proto__); // true
생성자의 prototype과 인스턴스의 __proto__는 같은 객체를 가리킨다.
 

__proto__

notion image
Animal.prototype.calcAge = function () { console.log(2022 - this.birthYear); } console.log(tiger); // Animal {species: 'Siberian', birthYear: 1234} console.log(tiger.__proto__); // {calcAge: ƒ, constructor: ƒ} tiger.calcAge(); // 788 console.log(tiger.__proto__.calcAge === tiger.calcAge); // true
  1. tiger라는 인스턴스 내부에는 calcAge 메서드가 없는데 어떻게 정상적으로 실행될까?
  1. tiger.__proto__ 내부에 메서드가 존재하는데 어떻게 tiger.calcAge()로 메서드가 실행될까?
 
__proto__는 생략 가능한 프로퍼티이기 때문이다.
📌
자바스크립트 구조를 설계한 브랜든 아이크가 ‘생략 가능한 프로퍼티’ 개념을 만듦
 
notion image
💡
[[Prototype]]의 값은 프로토타입 객체이며 __proto__(accessor property)로 접근할 수 있다. __proto__ 프로퍼티에 접근하면 내부적으로 Object.getPrototypeOf가 호출되어 프로토타입 객체를 반환한다.
 

Array.protype.map

  • 생성자 함수의 prototype에는 메서드가 저장되어 있다.
  • 생성자 함수를 바탕으로 생성된 인스턴스 arr로 map 메서드를 사용할 수 있다.
  • Array.prototype.map === arr.__proto__.map === arr.map
const arr = [1, 2, 3, 4, 5]; const newArr = arr.map((v) => v + 1); console.log(newArr); // [2, 3, 4, 5, 6]
 

참고하면 좋은 글

자바스크립트는 왜 프로토타입을 선택했을까
여기엔 여러 가지 해소되지 않는 질문이 있습니다. '왜 다른 언어처럼 클래스가 아니라 프로토타입인가?', '프로토타입은 어디서 나온 용어인가?'. 이 질문의 답은 쉽게 접할 수 있는 자료에선 찾을 수 없었습니다. (여기서 쉽게 접할 수 있는 자료란 서점에서 구매할 수 있는 책과 구글링 1~3페이지 내에 나오는 아티클을 뜻합니다) 프로토타입 외에도...
자바스크립트는 왜 프로토타입을 선택했을까
https://medium.com/@limsungmook/%EC%9E%90%EB%B0%94%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8%EB%8A%94-%EC%99%9C-%ED%94%84%EB%A1%9C%ED%86%A0%ED%83%80%EC%9E%85%EC%9D%84-%EC%84%A0%ED%83%9D%ED%96%88%EC%9D%84%EA%B9%8C-997f985adb42
자바스크립트는 왜 프로토타입을 선택했을까