
특정 객체의 메서드나 프로퍼티에 접근하고자 할 때, 해당 객체에 접근하려고 하는 프로퍼티나 객체가 없으면 프로토타입 링크를 따라 자신의 부모 역할을 하는 프로토타입 객체를 차례로 검색하는데 이 행위를 prototype-chain이라 한다.

1. architecture 라는 객체에는 age, sex 프로퍼티가 없기 때문에 prototype-chainging에 의해 Creator.prototype 객체의 age sex 프로퍼티에 접근한다.
2. musician 객체에는 age프로퍼티는 없기에 age는 prototype chainging에 의해 접근해서 값은 29를 갖게 되고,
3. sex프로퍼티는 있기 때문에 sex 프로퍼티의 경우에 프로토타입체이닝은 동작하지 않고 musician 객체의 sex 프로퍼티값을 반환한다.
4. architecture.__proto__ === Creator.prototype 상속받고 있다는 것을 알 수 있으며, __proto__(참조할때사용)를 통해서 모든 객체는 Object에 상속 받고 있음을 알 수 있다.
Object.create()메서드는 지정된 프로토타입 객체 및 속성(property)을 갖는 새 객체를 만듭니다. 라고 MDN에 나와있다.
나만의 메서드를 만들어보자.
1.Object.create()를 이용해서 Creator.prototype객체를 Object에 만들어서 Architecture라는 Creator에게 상속받는 객체를 이용할 수 있다.
2.Architecture는 Creator에게 상속 받게 되어 자신만의 메서드로 Creator와는 다른 기능을 구성해 꾸밀 수 있다.
3.이때 Creator 에게 상속받은 Architecture는 Creator의 인자까지 상속 받지 못하여 .call(), .apply()를 통해서 name인자를 받아준다. 이를 legacy(유산, 물려 내려오다.) 라고 한다.
class 선언은 프로토타입 기반 상속을 사용하여, 주어진 이름의 새로운 클래스를 만듭니다.
동작방식:
- 클래스 본문은 엄격 모드에서 실행됩니다.
- 생성자 속성은 선택 사항입니다.
- 클래스는 함수로 호출될 수 없습니다.
- 클래스 선언은 let과 const처럼 블록 스코프에 선언되며, 호이스팅(hoisting)이 일어나지 않습니다.
- 클래스의 메소드 안에서 super 키워드를 사용할 수 있습니다.

1. class Creator 선언 후 생성자함수(constructor)에 기본적인 인자를 넣어줍니다.
2. 이를 상속하기 위한 Sub Class인 class Architecture에 extends 를 이용하여 Creator를 상속 받아줍니다. 앞에서 Object.create()와 비슷하다는것을 볼 수 있습니다.
3. 아빠 와 상속받는 아이 메서드가 같은 경우 constructor, super를 사용하지 않아도 됩니다.
4. console.log 찍어 보기!


왜 function이라고 나올까?