JavaScript는 프로토타입 기반 언어(prototype-based language)라 불림

모든 객체들이 메소드와 속성들을 상속 받기 위한 템플릿으로써 프로토타입 객체(prototype object)를 가진다는 의미

프로토타입 객체는 메소드와 속성을 상위 프로토타입으로 부터 상속 받을 수도 있고 그 상위 프로토타입 객체도 마찬가지, 이를 프로토타입 체인(prototype chain)이라 부름

다른 객체에 정의된 메소드와 속성을 한 객체에서 사용할 수 있도록 하는 근간

상속되는 속성과 메소드들은 각 객체가 아니라 객체의 생성자의 prototype이라는 속성에 정의되어 있음

function Person(first, last) {
  this.first = first;
  this.last = last;
}

const person1 = new Person("DK", "Choi");

console.log(person1.valueOf());
  1. 브라우저는 person1 객체가 valueOf() 메소드를 가지고 있는지 체크
  2. 없으므로 person1의 프로토타입 객체(Person() 생성자의 프로토타입)에 valueOf() 메소드가 있는지 체크
  3. 없으므로 Person() 생성자의 프로토타입 객체의 프로토타입 객체(Object() 생성자의 프로토타입)가 valueOf() 메소드를 가지고 있는지 체크. 있음, 호출 끝

프로토타입 속성: 상속 받은 멤버들이 정의된 곳

Object.prototype.watch(), Object.prototype.valueOf() 등은 생성자를 통해 새로 생성되는 인스턴스는 물론 Object.prototype을 상속 받는 객체라면 어떤 객체에서든 접근 가능

Object.is(), Object.keys()등 prototype 버킷에 정의되지 않은 멤버들은 상속되지 않음. 이것들은 Object() 생성자에서만 사용 가능

class Human {
  constructor(name, age) {
    this.name = name;
    this.age = age;
  }

  sleep() {
    console.log(`${this.name}은 잠에 들었습니다`);
  }
}

let kimcoding = new Human("김코딩", 30);

Human.prototype.constructor === Human;
Human.prototype === kimcoding.__proto__;
Human.prototype.sleep === kimcoding.sleep;

console.log(Human.prototype.constructor); // Human이 생성자에게 상속하는 prototype
console.log(Human); // class Human object 자체
console.log(kimcoding.__proto__); // 김코딩이 상속받은 Human에서 정의된 prototype
console.log(Human.prototype); // Human에서 정의된 prototype
console.log(kimcoding.sleep); // 김코딩이 상속받은 Human에 정의된 메서드
console.log(Human.prototype.sleep); // Human에서 정의된 메서드

카테고리:

태그:

업데이트:

댓글남기기