객체는 상속이라는 참조연결방식을 사용한다.
객체 프로퍼티에 접근하면 속성접근자는 자신객체부터 시작해서 최상위객체까지 검색해서 찾은 프로퍼티를 객체의 프로퍼티로 참조연결해준다.
자바스크립트가 발전함에따라 class문법이 도입되고 도입전 상속문법과 class 상속문법이 혼용되어 사용되고 있다.
(class문법은 익스플로러에서 지원되지 않는다)
class 도입전
객체[[prototype]]숨김속성에 상위객체를 참조할당하면 상속관계가 형성된다.
[[prototype]]은 숨김속성이기 때문에 사용자가 직접 할당할 수 없고 간접적인 방법으로 설정해야 한다.
let user ={ // new Object생성자함수 간편문법이다.
name:'lee'
};
let user = new Object({name:'lee'}); // 객체생성 표준문법
Object라는 class(생성자함수)를 사용해 객체를 만든다.
user객체가 만들어지면 내부적으로 user[[prototype]] = Object.prototype;이 수행되어 user의 상위객체는 Object.prototype이라는 객체로 설정된다.
Object.prototype객체는 무엇인가?
생성자함수는 객체생성 역활을 하는 함수로서 객체가 아니기 때문에 생성된 객체와 상속관계를 형성할 수 없다.
자바스크립트 모든 함수는 생성시 객체상속을 위한 빈객체를 만들고 constructor속성에 생성자함수를 참조할당하도록 되어있다.
또한 모든 함수는 생성시 prototype일반속성을 가지며 좀전에 만들어진 객체를 참조할당하도록 되어있다.
이렇게 되면 생성자함수와 객체는 순환참조를 형성하게된다.
생성자함수.prototype = constructor프로퍼티를 가진 객체;
객체.constructor = 생성자함수;
user의 상위객체는 Object.prototype객체가 되기때문에 user는 자신의 프로퍼티와 Object.prototype객체의 프로퍼티를 상속받아 사용할 수 있다.
for (const key in user) {
console.log(key); // name
}
user에는 name프로퍼티만 있다고 출력된다.
Object.prototype객체에는 프로퍼티가 없는 걸까?
Object.prototype객체에는 아래와같은 프로퍼티들이 있다.
constructor
__defineGetter__
__defineSetter__
hasOwnProperty
__lookupGetter__
__lookupSetter__
isPrototypeOf
propertyIsEnumerable
toString
valueOf
__proto__
toLocaleString
위 프로퍼티들은 enumerable속성이 false로 되어있어 열겨되지 않을 뿐이다.
위 속성목록중에 __proto__속성이 있다.
모든 객체는 이 속성을 상속받기때문에 이 속성에 객체를 할당하면 [[prototype]]속성이 변경되어 상속관계가 형성된다.
반대로 생각해서 이 속성이 없다면 상속기능을 사용할 수 없는 것이다.