👨‍💻
프론트엔드 기술 블로그
  • 프론트엔드 기술 저장소
  • React
    • React Hook
      • useRef
      • useReducer
      • useCallback
      • useMemo
      • useState
      • useEffect
      • useContext
      • Custom Hook
  • Javascript
    • 자바스크립트 기본
      • 데이터타입
      • 배열메소드
      • 타입 및 객체 체크
      • this
        • bind, call, apply
      • 프로토타입
      • 클로저
      • 스코프
      • 함수
      • 호이스팅
    • ECMAScript 6
      • let, const
      • 화살표 함수
      • 구조분해할당
      • Promise
      • 템플릿 문자열 표현식
      • 이터레이션
      • 클래스 (Class)
      • 심볼 (Symbol)
      • 제너레이터
  • 객체지향설계
    • 객체 지향 설계 원칙
      • 단일 책임 원칙
      • 개방 폐쇄 원칙
      • 리스코프 치환 원칙
      • 인터페이스 분리 원칙
      • 의존 역전 원칙
  • 브라우저와 자바스크립트
    • Document Object Model
      • DOM API
      • 이벤트 (Event)
  • Node.js
    • 번들러
      • webpack 설정
    • node.js 버전 관리
  • HTTP
    • HTTP 기본
      • 1. 웹과 네트워크 기본
        • 1.1 웹은 HTTP로 나타낸다.
        • 1.2 HTTP 탄생과 성장
        • 1.3 네트워크 기본 TCP/IP
        • 1.4 HTTP와 관계가 깊은 프로토콜 IP/TCP/DNS
        • 1.5 이름 해결 담당 DNS
        • 1.6 각각과 HTTP와의 관계
        • 1.7 URI와 URL
      • 2. 프로토콜 HTTP
        • 2.1 HTTP는 클라이언트와 서버간에 통신을 한다.
        • 2.2 리퀘스트와 리스폰스를 교환하여 성립
        • 2.3 상태를 유지하지 않는 프로토콜 HTTP
        • 2.4 리퀘스트 URI로 리소스 식별
        • 2.5 HTTP 메소드
        • 2.6 메소드 사용
        • 2.7 지속연결로 접속량 절약
        • 2.8 쿠키를 사용한 상태관리
      • 3. HTTP 정보는 HTTP 메시지에 있다.
        • 3.1 HTTP 메시지
        • 3.2 리퀘스트 메시지와 리스폰스 메시지 구조
        • 3.3 인코딩으로 전송 효율을 높이다.
        • 3.4 여러 데이터를 보내는 멀티파트
        • 3.5 일부분만 받는 레인지 리퀘스트
        • 3.6 최적의 콘텐츠를 돌려주는 콘텐츠 네고시에이션
      • 4. 결과를 전달하는 HTTP 상태코드
        • 4.1 상태코드는 서버로부터 리퀘스트 결과를 전달한다.
        • 4.2 2xx 성공
        • 4.3. 3xx 리다이렉트
        • 4.4 4xx 클라이언트 에러
        • 4.5 5xx 서버 에러
      • 5. HTTP와 연계하는 웹 서버
        • 5.1 1대로 멀티 도메인을 가능하게 하는 가상 호스트
        • 5.2 통신을 중계하는 프로그램 : 프록시, 게이트웨이, 터널
      • 7. 웹을 안전하게 HTTPS
        • 7.1 HTTP의 약점
        • 7.2 HTTP+암호화+인증+완전성보호 = HTTPS
  • IDE
    • Webstorm
      • 웹스톰 단축키
      • 웹스톰 소스코드 특정폴더 검색 제외
  • GIT
    • Git 기초 명령어
Powered by GitBook
On this page

Was this helpful?

  1. Javascript
  2. 자바스크립트 기본

프로토타입

자바스크립트 프로토타입

자바스크립트 객체는 부모객체를 의미하는 프로토타입 객체가 있고, 자식 객체는 내부적으로 부모객체를 가리키는 내부 프로토타입 링크가 있다. 이 프로토타입을 이용해 상속을 구현한다. 여기서는 프로토타입이 무언인지 알아보려한다.

자바스크립트 객체 생성 방법

  • 생성자로 객체 생성

function Language(name) {
  this.name = name;
}

const js = new Language('javascript');

console.log(js);
  • 리터럴로 객체 생성

const js = {
  name: 'javascript'
}

console.log(js);

두 방법 모두 name 프로퍼티가 있고 값도 'javascript'로 같다. 또한 생성된 객체는 내부적으로 부모객체를 가리키는 프로토타입 링크도 있다.

여기까지 보면 두 객체는 같아 보이지만 부모객체는 서로 다른 객체를 가리키고 있다. 결론만 얘기하면 생성자를 통한 객체는 생성자.prototype , 리터럴로 생성한 객체는 Object.prototype을 가리킨다.

크롬에서는 __proto__ 프로퍼티로 부모객체를 참조 할 수 있다.

const js = {
  namd: 'javascript'
}

console.log(js.__proto__ === Object.prototype); //true
function Language(name) {
  this.name = name;
}

const js = new Language('javascript');

console.log(js.__proto__ === Language.prototype); //true

생성자를 통한 객체생성은 당연히 생성자.prototype을 가리키고 리터럴 생성방은 다음과 같다고 할 수 있다.

const preJs = {
  name: 'javascript',
}

const js = new Object();
js.name = 'javascript';


console.log(preJs.__proto__ === js.__proto__); //true

console.log(preJs.__proto__ === Object.prototype); //true
console.log(js.__proto__ === Object.prototype); //true

프로토타입의 핵심은 두가지가 있다고 생각한다.

  1. 프로토타입 체인

  2. 프로토타입 프로퍼티 공유

프로토타입 체인

객체의 변수나 메소드를 사용할때 검색하는 메커니즘이다. 해당 객체에 프로퍼티가 없으면 부모객체를 차례대로 올라가며 검색한다.

Object.prototype.getName = function() {
  return this.name;
}

function Language(name) {
  this.name = name;
}

const js = new Language('javascript');

console.log(js.getName());
  • js.getName() 메서드 호출한다.

  • js 객체에 getName이 있는지 찾는다.

  • js객체에 getName 없는것을 확인한다.

  • Language.prototype 객체에 getName 이 있는지 찾는다.

  • Language.prototype 객체에 getName이 없는것을 확인한다.

  • Object.prototype 에 getName 을 찾아 메서드를 실행한다.

  • 메서드를 실행하는 객체는 js객체 이므로 this는 js이다.

  • return js.name

프로토타입 프로퍼티 공유

같은 생성자로 생성된 객체들은 같은 부모객체(prototype)를 가르키기 때문에 prototype 객체에 프로퍼티를 추가한다면 모든 자식에서 접근가능하다.

function Language(name) {
  this.name = name;
}

Language.prototype.getName = function (){
 return this.name;
}

const child_1 = new Language('javascript');
const child_2 = new Language('java');

console.log(child_1.getName());
console.log(child_2.getName());
  • child_1, child_2 는 같은 생성자로 객체를 생성한다.

  • 같은 생성자로 생성되었으니 당연 같은 prototype을 가리킨다.

  • child_1.__proto__ -> Language.prototype

  • child_2.__proto__ -> Language.prototype

  • 두 child 모두 getName을 호출한다.

  • prototype에서 getName을 찾아서 호출한다.

  • this는 누가 호출했냐에 따라 달라지므로 호출한 객체를 this로 바인딩한다.

  • 각 child name을 리턴한다.

Previousbind, call, applyNext클로저

Last updated 2 years ago

Was this helpful?