https://medium.com/@limsungmook/자바스크립트는-왜-프로토타입을-선택했을까-997f985adb42

**class**
이분법적. 추상과 추상을 구체화한 본질.
class Chair -> 추상적인 개념. 코드상으로만 있고, 실제 메모리상에 존재 x.
Chair chair = new Chair(). 객체. 실제 메모리에 잡혔다. 현실세계.

분류
개체의 속성이 동일한 경우 개체 그룹이 같은 범주에 속한다.
프로퍼티가 유사한 객체가 있다면 일반화 과정을 통해 class로 추상화!
**Prototype**
class 와는 전혀 다른 관점으로 개체를 바라본다.
올바른 분류란 없다. 이분법적으로 나누는건 애초에 불가능!

사용에 의해서 단어의 의미가 된다. 상황과 맥락에 의해서 그 의미가 결정된다.
JS는 맥락, Context 가 아주 중요한 언어다. ex) 의미사용이론,가족 유사성

...

인간은 사물을 분류할 때 자연스럽게 가장 유사성 높은 것 순서대로 등급을 매긴다는 
의미로 볼 수 있다. 이렇게 분류했을 때 가장 높은 등급을 가진 녀석이 나올 텐데, 
이것이 바로 원형(Prototype)이다. 란 주장이 프로토타입 이론이다.

요약.
현실에 존재하는 것 중 가장 좋은 본보기를 원형으로 선택한다.
문맥에 따라 범주, 즉 의미가 달라진다.
**호이스팅?**
JS 엔진은 코드가 로드될 때 실행 문맥(context) 을 생성한다. 그리고 렉시컬 스코프 내의
변수, 함수등의 선언이 최상단을 끌어 올려 지는 것이다.
렉시컬은 단어의 의미가 사용되는 근처.

**this?**
this를 발화가 어디서 되었으냐가 매우 중요하다! 실행하는 객체가 중요하다는 의미!

var someValue = 'hello';
function outerFunc() {
    console.log(this.someValue); // 첫번째 : ?, 두번째 : ?
    this.innerFunc();
}
const obj = {
    someValue : 'world',
    outerFunc,
    innerFunc : function() {
        console.log("innerFunc's this : ", this); // 첫번째 : ?, 두번째 : ?
    }
}
**obj.outerFunc();** // 첫번째
**outerFunc();** // 두번째

내가 이해한 바로는

첫번째로 실행되는 obj.outerFunc(). obj에서 발화 된다. obj 의 this 를 가지고 있다.
그리고 obj 에서 outerFunc 로 타고 들어가면 log 가 찍힌다. 이때 this.someValue는
'world' 가 되는 것이다. 또한 다음 줄에 있는 this.innerFunc() 또한 obj 를 가리키게
된다. obj 에서 innerFunc() 를 보면 this 는 obj 가 되는 것이다.

두번째 outerFunc(). outerFunc() 를 타고 들어가면 여기서의 this 는 global이다.
따라서 외부에서 someValue 를 찾게 된다. 'hello' 라 찍힌다. 또한 innerFunc()는
global 에 없기 때문에 error 를 뱉을 것이다.
var value = 1;

var obj = {
  value: 100,
  foo: function() {
    setTimeout(function() {
      console.log("callback's this: ",  this);  // ?
      console.log("callback's this.value: ",  this.value);  // ?
      function bar() {
        console.log("bar's this: ", this);  // ?
      }
      bar();
    }, 1000);
  }
};

obj.foo();

브라우저 위라면 문제에서 this 는 window
node.js 위라면 문제에서 this 는 Timer 객체 를 기리킨다.

this.value 는 브라우저라면 1, node.js 라면 undefined 가 나온다.
bar() 안의 this 는 브라우저라면 window, node.js 라면 global!
실행 컨텍스트란 실행할 코드에 제공할 환경 정보들을 모아놓은 객체로서, 
동일한 스코프에 있는 코드들을 실행할 때 필요한 환경 정보를 모아 컨텍스트를 구성하고,
이를 호출 스택(콜 스택)에 쌓아서 실행 순서를 보장합니다.

실행 컨텍스트 구성요소
변수객체, SCOPE CHAIN, this