JavaScript는 흔히 프로토타입 기반 언어(prototype-based language)라 불린다.
모든 객체들이 메소드와 속성들을 상속 받기 위한 템플릿으로써 프로토타입 객체(prototype object)를 가진다는 의미
모든 객체는 최소한 하나 이상의 다른 객체로부터 그들의 프로토타입으로부터 프로퍼티와 메소드를 상속받는다.
상속되는 정보를 제공하는 객체를 프로토타입(prototype)이라 한다.
정확히 말하자면 상속되는 속성과 메소드들은 각 객체가 아니라 객체의 생성자의 prototype이라는 속성에 정의되어 있다. -MDN-
.prototype
, .__proto__
, 클래스, 인스턴스, 프로토타입의 관계
JavaScript는 프로토타입 기반 언어이고
프로토타입 체인을 사용하여 객체 지향 프로그래밍의 특성 중 상속을 구현한다.
즉 흔히 사용하는 것들 .length
, .slice
같은 메서드를 사용하는것 자체가 이미 프로토타입을 통해 상속 하는 중인 것이다. .__proto__
를 통해 부모를 찾으면 결국 Object 클래스에 속해 있음을 알 수있다. (프로토체인 페이지에 정리 했으니 확인)
String.prototype.abc = ‘zzzzzz’;
입력시 String 포토타입 객체안에 추가된다. {abc : ‘zzzzzz’}
콘솔창에 String.prototype
를 입력해보면 수많은 메서드가 저장되어 있다
.__proto__
은 프로토타입 링크라고 불리며, 프로토타입 객체 안에 접근하기위한 방법
.__proto__
를 이용하면 부모 클래스의 프로토타입 부터 '부모의 부모' .. 조상 클래스 까지 프로토타입을 탐색할 수 있다.
class
를 생성할때 onstructor
, new
를 반드시 사용하여 인스턴스를 만든다.park
에 새로운 인스턴스를 할당시키면 Human
의 프로토타입을 상속받는다.Human
의 프로토타입 안에 있는 메서드 .sleep
을 사용할 수 있다.class Human {
constructor(name, age) {
this.name = name;
this.age = age;
}
sleep() {
console.log(`${this.name}은 잠에 들었습니다`);
}
}
let park = new Human('park', 30); // 깊은복사
배열도 원리가 동일하다,
new
키워드로 배열 arr
을 만들어 Array
클래스를 상속받아 메서드를 사용 할 수 있다.
Array
가 클래스 이고 다양한 프로토타입 메서드를 상속받음
프로토타입을 한마디로 정의하자면 뭔가?
상속하기위한 메커니즘이다.
.prototype
은 메서드가 모여있는 객체이고 사용하면 메서드를 확인할 수 있다.
.__proto__
를 사용하면 부모 클래스 메서드를 확인 할 수있다.
MDN
참고하자