js에서 상속은 다른 객체 지향 언어의 클래스 상속과 다름
대부분의 객체 지향 언어의 클래스 상속은 복사의 형태지만 js에서 상속은 프로토타입 기반 상속(프로토 체이닝)
__proto__
를 뜻함프로토타입은 클래스, 객체의 내용 복사 없이도 상속을 구현할 수 있게 해주는 방법
프로토타입은 연결, 유전자
js는 프로토타입을 기반으로 한 객체지향언어
js의 모든 객체는 자신의 부모 역할을 하는 객체와 연결되어 있음
이것은 마치 객체 지향의 상속 개념과 같이 부모 객체의 프로퍼티 또는 메서드를 상속받아 사용할 수 있게 함
이러한 부모 객체를 prototype
이라고 함
js의 모든 객체는 [[Prototype]]
이라는 인터널 슬롯을 가짐
[[Prototype]]
은 null 또는 객체이며 상속을 구현하는데 사용됨
객체명.__proto__
Object.getPrototypeOf(객체명)
function Newjeans(name, age) {
this.name = name;
this.age = age;
}
const minji = new Newjeans('민지', 20);
console.log(minji.__proto__ === Newjeans.prototype) // true
객체간 상속의 연결 고리는 프로토타입 체인으로 연결 되어 있음
[[Prototype]] 와 prototype 프로퍼티는 다르다
prototype 프로퍼티
와 [[Prototype]]
은 모두 프로토타입 객체를 가리키지만 관점의 차이가 있음
프로토타입 객체는 constructor 프로퍼티를 가짐
이 constructor 프로퍼티는 객체의 입장에서 자신을 생성한 객체를 가리킴
js는 특정 객체의 프로퍼티나 메서드에 접근할 때 해당 객체에 없으면 [[Prototype]]이 가리키는 링크를 따라 부모 역할을 하는 프로토타입 객체의 프로퍼티나 메서드를 차례대로 검색함
객체 생성 방법
js엔진이 내부적으로 리터럴 방식을 Obeject( ) 생성자 함수를 통해 생성함
Object( ) 생성자 함수도 함수임으로 prototype 프로퍼티가 있음
Obeject( ) 생성자 함수
: new Obeject( )
즉, 객체 리터럴을 사용하여 객체를 생성하면 그 객체의 프로토타입 객체는 Object.prototype
그래서 toString( )
같은거 바로 사용가능함
함수 정의 방식
js엔진이 내부적으로 함수 선언식을 함수 표현식으로 바꿔줌
// 변경 전 선언식 모습
function sum(x, y){
return x + y;
}
//변경 후 표현식 모습
var sum = function sum(x, y){
return x + y;
}
함수 선언식이든 표현식이든 모두 함수 리터럴 방식을 사용
js엔진이 내부적으로 함수 리터럴 방식을 Function( ) 생성자 함수로 바꿔줌
즉, 함수를 어떻게 정의하든 Function( ) 생성자 함수로 함수 객체가 만들어짐
그래서 모든 함수 객체의 prototype 객체가 Function.prototype
생성자 함수도 함수 객체이므로 생성자 함수의 prototype 객체는 Function.prototype
__proto__
를 이용해 닫힌 형태로 다른 객체를 참조하면 에러가 발생)__proto__
의 값은 객체나 null만 가능 (다른 자료형은 무시)