[스터디] 프로토타입_part2

김하은·2024년 3월 1일
0

스터디

목록 보기
2/23

객체 생성 방식과 프로토타입의 결정

  • 객체 생성방법은 다양함
    • 객체 리터럴
    • Object 생성자 함수
    • 생성자 함수
    • Object.create 메서드
    • 클래스(ES6)
  • 각 객체 생성방식은 추상 연산 OrdinaryObjectCreate에 의해 생성된다는 공통점이 있음
  • 프로토타입은 추상 연산 OrdinaryObjectCreate에 전달되는 인수에 의해 결정되며 이 인수는 객체가 생성되는 시점에 객체 생성방식에 의해 결정됨

객체 리터럴에 의해 생성된 객체의 프로토 타입

  • 객체 리터럴에 의해 생성되는 객체의 프로토타입은 Object.prototype임

Object 생성자 함수에 의해 생성된 객체의 프로토타입

  • Object 생성자 함수에 의해 생성되는 객체의 프로토타입은 Object.prototype임
  • 객체 리터럴에 의해 생성된 객체와 동일한 구조를 가짐
  • 객체 리터럴과 Object 생성자 함수에 의한 객체 생성 방식의 차이는 프로퍼티를 추가하는 방식임
    • 객체리터럴: 객체 내부에 프로퍼티 추가
    • Object 생성자 함수: 일단 빈 객체를 생성한 이후 프로퍼티를 추가해야함

생성자 함수에 의해 생성된 객체의 프로토타입

  • 생성자 함수에 의해 생성되는 객체의 프로토타입은 생성자 함수의 prototype프로퍼티에 바인딩되어 있는 객체임

프로토타입 체인

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

//프로토타입 메서드
Person.prototype.sayHello = function () {
  console.log(`Hi! My name is ${this.name}`);
};

const me = new Person('Lee');

// hasOwnProperty는 Object.prototype의 메서드다.
console.log(me.hasOwnpProperty('name'));//true
  • Person 생성자 함수에 의해 생성된 me 객체는 Object.prototype의 메서드인 hasOwnProperty를 호출할 수 있음
  • 이는 me 객체가 Person.prototype뿐만 아니라 Object.prototype도 상속받았다는 것을 의미함
  • me 객체의 프로토타입은 Person.prototype임
object.getPrototypeOf(me) === Person.prototype; //true
  • Person.prototype의 프로토타입은 object.prototype임
  • 프로토타입의 프로토타입은 언제나 Object.prototype임
Object.getPrototypeOf(Person.prototype) === object.prototype; //true

자바스크립트는 객체의 프로퍼티(메소드 포함)에 접근하려고 할 때 해당 객체에 접근하려는 프로퍼티가 없다면 [[Prototype]] 내부 슬롯의 참조를 따라 자신의 부모 역할을 하는 프로토타입의 프로퍼티를 순차적으로 검색한다. 이를 프로토타입 체인이라 한다.

참고 자료

  • 이웅모,『모던 자바스크립트 Deep Dive』, 위키북스(2021), p280-312.
profile
아이디어와 구현을 좋아합니다!

0개의 댓글