프로토타입

최형필·2021년 2월 14일

코어자바스크립트

목록 보기
6/6

https://media.vlpt.us/images/corete/post/2bea36ba-3fd0-4fbd-bedb-78d2cd6e4ef3/%EC%BD%94%EC%9E%90%201%EC%9E%A5.png

프로토타입 개념이해


https://media.vlpt.us/images/iamjoo/post/6ed79566-7ae7-4acb-91a7-39cdee457d55/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202021-01-13%20%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%203.37.26.png

  • 어떤 생성자 함수를 new 연산자와 함께 호출하면

  • Constructor에서 정의된 내용을 바탕으로 새로운 인스턴스가 생성된다.

  • 이때 instance에는 proto 라는 프로퍼티가 자동으로 부여되는데,

  • 이 프로퍼티는 Constructor의 prototype이라는 프로퍼티를 참조한다.

  • proto 는 생략 가능한 프로퍼티이다.

piri.__proto__.getName
-> piri.(.__proto__).getName
-> piri.getName
  • 생성자 함수의 prototype에 어떤 메서드나 프로퍼티가 있다면 인스턴스에서도 마치 자신의 것처럼 해당 메서드나 프로퍼티에 접근할 수 있게 된다.

https://media.vlpt.us/images/iamjoo/post/06ed8c8b-bb1e-4bcf-9567-54b101493e7b/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202021-01-13%20%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%204.07.55.png

costructor 프로퍼티

  • constructor는 읽기 전용 속성이 부여된 예외적인 경우 (기본형 리터럴 변수 - number, string 등) 을 제외하고는 값을 바꿀 수 있다.
  • constructor를 변경하더라도 참조하는 대상이 변경될 뿐 이미 만들어진 인스턴스의 원형이나 데이터 타입이 바뀌는것은 아니다.

프로토타입 체인


메서드 오버라이드

  • prototype 객체를 참조하는 __proto를 생략하면 인스턴스는 prototype에 정의된 프로퍼티나 메서드를 마치 자신의 것처럼 사용할 수 있다고 했다.

그러면 만약 인스턴스에 동일한 이름의 프로퍼티 또는 메서드를 가지고 있다면

**const Person = function(name) {
	this.name = name;
}

Person.prototype.getName = function() {
	console.log(this.name);
}

const piri = new Person('piri');
piri.getName = function () {
	console.log('vv', this.name);
}

piri.getName(); // vv piri**
  • piri 인스턴스에 있는 getName이 호출되었다.
  • 자바스크립트 엔진이 getName 메서드를 찾는 방식은 가장 가까운 대ㅔ상인 자신의 프로퍼티를 검색하고 없으면 그 다음으로 가까운 대상인 proto 를 검색하는 순서로 진행

프로토타입 체인

https://media.vlpt.us/images/iamjoo/post/20cd444a-f12f-4ae2-9c60-d99865ab642a/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202021-01-13%20%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%204.27.16.png

var arr = [1,2];
arr(.__proto__).push(3); // Array prototype
arr(.__proto__)(.__proto__).hasOwnProperty(2); // Object prototype
  • 어떤 데이터의 proto 프로퍼티 내부에 다시 proto 프로퍼티가 연쇄적으로 이어진 것을 프로토타입 체인이라 한다
  • 이 체인을 따라가며 검색하는 것을 프로토타입 체이닝 이라고 한다.
  • 프로토타입 체이닝은 메서드 오버라이드와 동일한 맥락으로 메서드를 찾는다.

객체 전용 메서드의 예외사항

  • Object.prototype은 언제나 최상단에 위치한다.
  • 따라서 객체에만 사용할 메서드는 프로토타입 내에 정의할 수 없다.
  • 객체 한정 메서드를 만들려면 Object 객체에 static 메서드를 넣는다.
profile
프론트엔드 개발자

0개의 댓글