[Day 20] 프로토 타입
프로토타입 (Prototype)
-
객체를 만들 때 마다 메소드를 새로 만들어서 넣는 것은 메모리를 굉장히 낭비하는 일이다.
-
비슷한 객체들이 서로 공유하는 속성을 한 곳에 모아두기 위해 사용하는 것이
프로토타입
이다. -
어떤 객체에 프로토타입을 지정하면 프로토타입의 속성을 해당 객체에서 재사용할 수 있다.
-
객체의 프로토타입 지정 방법 (
Object.create()
)const personPrototype = { introduce: function() { return `안녕하세요, 제 이름은 ${this.name}입니다.`; } }; const person1 = Object.create(personPrototype); // 새 객체를 생성하고 프로토타입을 지정함 person1.name = '윤아준'; const person2 = Object.create(personPrototype); person2.name = '신하경'; person1.introduce(); // 안녕하세요, 제 이름은 윤아준입니다. person2.introduce(); // 안녕하세요, 제 이름은 신하경입니다. person1.introduce === person2.introduce; // true
-
프로토타입 기능을 이용해 한 객체에서 다른 객체의 기능을 가져와 사용하는 것을
프로토타입 상속(prototype inheritance)
라고 한다. -
프로토타입 읽고 쓰기
Object.getPrototypeOf
: 어떤 객체의 프로토타입을 읽어오기 위해 사용하는 함수Object.setPrototypeOf
: 이미 생성된 객체의 프로토타입을 변경하기 위해 사용하는 함수(속도가 굉장히 느리기 때문에 사용 지양)- 객체 리터럴
{}
을 통해 생성된 객체의 프로토타입에는 자동으로Object.prototype
이 지정된다.
-
프로토타입 체인 (Prototype Chain)
- Javascript 엔진은 속성 접근자를 통해 어떤 객체의 속성을 확인할 때 프로토타입 체인을 전부 확인한다.
- 어떤 객체에 찾는 속성이 없다면 프로토타입 객체의 속성까지 확인한다. (더 이상 프로토타입이 없다면 undefined를 반환)
const obj1 = { a: 1 }; const obj2 = { b: 2 }; const obj3 = { c: 3 }; // `obj3 -> obj2 -> obj1` 과 같이 상속 Object.setPrototypeOf(obj2, obj1); Object.setPrototypeOf(obj3, obj2); console.log(obj3.a); // `obj3`의 프로토타입의 프로토타입에 존재하는 속성 `a`의 값을 출력 console.log(obj3.b); // `obj3`의 프로토타입에 존재하는 속성 `b`의 값을 출력 console.log(obj3.c); // `obj3`에 존재하는 속성 `c`의 값을 출력
(Object).prototype.isPrototypeOf()
: 어떤 객체가 다른 객체의 프로토타입 체인에 존재하는지 확인하기 위해 사용한다.
-
프로토타입의 간접적 변경
- 어떤 객체의 속성을 변경하거나 속성을 삭제하는 일은 그 객체의 프로토타입에 아무런 영향을 미치지 않는다.
- 자식 객체의 프로토타입 체인을 이용해 부모 객체의 속성을 변경하는 것은 절대로 불가능하다!!! (읽어오는 것만 가능하다..)
-
생성자와 프로토타입
- 생성자를 통해 만들어낸 객체의 프로토타입에는 생성자의
prototype
속성에 저장되어 있는 객체가 자동으로 지정된다. - Javascript 에서는
function
구문을 통해 함수를 정의할 때 함수의prototype
속성에 객체가 자동으로 생성되어 저장된다.
- 생성자를 통해 만들어낸 객체의 프로토타입에는 생성자의
-
정적 메소드 (Static Method)
- 생성자의 속성에 직접 지정된 메소드를 정적 메소드라고 한다.
- 정적 메소드는 특정 인스턴스에 대한 작업이 아니라, 해당 생성자와 관련된 일반적인 작업을 정의하고 싶을 때 사용한다.
// 생성자의 속성에 함수를 직접 할당합니다. Person.compareAge = function(person1, person2) { if (person1.age < person2.age) { return '첫 번째 사람의 나이가 더 많습니다.'; } else if (person1.age === person2.age) { return '두 사람의 나이가 같습니다.'; } else { return '두 번째 사람의 나이가 더 많습니다.'; } }
댓글남기기